Polimorfizm, przesłanianie, przeciążanie – MUST KNOW!

  • Polimorfizm dotyczy przesłaniania, nie przeciążania.
  • Typ referencji (zmiennej) określa jakie metody mogą być wywoływane.
  • Typ obiektu określa, która przesłonięta metoda zostanie użyta w czasie wywołania.
  • Typ referencji określa, która przeciążona metoda zostanie użyta w czasie kompilacji.

2 komentarze to “Polimorfizm, przesłanianie, przeciążanie – MUST KNOW!”

  • Tomek says:

    Wg. mnie w czwartym punkcie jest błąd. Typ referencji określa która przesłonięta metoda zostanie użyta podczas kompilacji (a nie przeciążona).

    • Barista says:

      Tomku, nie ma tam błędu. Spójrz na poniższy przykład.

      class Animal { }
      
      class Cat extends Animal { }
      
      class Dog extends Animal { }
      
      public class AnimalTester {
      
      	void say(Animal a) {
      		System.out.println("Say like Animal");
      	}
      
      	void say(Cat c) {
      		System.out.println("Say like Cat");
      	}
      
      	void say(Dog d) {
      		System.out.println("Say like Dog");
      	}
      
      	void say(Object o) {
      		System.out.println("Say like Object");
      	}
      
      
      	public static void main(String[] args) {
      		AnimalTester animalTester = new AnimalTester();
      
      		// different reference types
      		Animal animalReferenceOfAnimal = new Animal();
      		Cat catReferenceOfCat = new Cat();
      		Dog dogReferenceOfDog = new Dog();
      
      		animalTester.say(animalReferenceOfAnimal);
      		animalTester.say(catReferenceOfCat);
      		animalTester.say(dogReferenceOfDog);
      
      		// same reference type
      		Animal animalReferenceOfCat = new Cat();
      		Animal animalReferenceOfDog = new Dog();
      
      		animalTester.say(animalReferenceOfCat);
      		animalTester.say(animalReferenceOfDog);
      
      		// same (Object) reference type
      		Object objectReferenceOfAnimal = new Animal();
      		Object objectReferenceOfCat = new Cat();
      		Object objectReferenceOfDog = new Dog();
      
      		animalTester.say(objectReferenceOfAnimal);
      		animalTester.say(objectReferenceOfCat);
      		animalTester.say(objectReferenceOfDog);
      	}
      }
      

      Po uruchomieniu programu powinno pojawić się coś takiego:

      Say like Animal
      Say like Cat
      Say like Dog
      Say like Animal
      Say like Animal
      Say like Object
      Say like Object
      Say like Object
      

      Jak widzisz, typ referencji (po lewej stronie zmiennej) decyduje, która przeciążona metoda zostanie wywołana.

Leave a Reply