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.
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).
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:
Jak widzisz, typ referencji (po lewej stronie zmiennej) decyduje, która przeciążona metoda zostanie wywołana.