Имам някакъв въпрос относно upcast/downcast.
Създадох абстрактен супер клас Animal, подклас Dog и подклас BigDog. и аз също давам абстрактен метод в Animal и го замествам в Dog и BigDog.
abstract public class Animal {
abstract public void greeting();
}
public class Dog extends Animal {
@Override
public void greeting() {
System.out.println("Woof!");
}
}
public class BigDog extends Dog {
@Override
public void greeting() {
System.out.println("Woow!");
}
}
сега моят тестов код:
public class TestAnimal {
public static void main(String[] args) {
Animal animal2 = new Dog();
Animal animal3 = new BigDog();
// Downcast
Dog dog2 = (Dog) animal2; //cast Animal class to Dog class, legit
BigDog bigDog2 = (BigDog) animal3; //cast Animal to BigDog, legit;
Dog dog3 = (Dog) animal3; //Animal Class contains BigDog cast into Dog?
dog2.greeting();
dog3.greeting(); //in which class the method is called?
}
}
Разбирам връзката между суперклас/подклас и как работи cast. Въпросът ми обаче е, можете ли да прехвърлите суперклас в конкретен подклас, знаейки, че има клас между тях? например, ако имам обект от клас Animal, който съдържа обект BigDog, мога ли да прехвърля обекта към Dog? какво ще стане, ако има методи в BigDog, които не съществуват в Dog?
накратко, със сигурност можете да кажете, че обект от суперклас е обект от подклас, но защо можете да инвертирате?
Като се замисля,
Предполагам това: питам JVM да прехвърли препратка към клас Animal към Dog и да свърже новата препратка Dog към обекта BigDog, вместо наистина да предаде обекта BigDog.
Така че мога да извикам всички методи Dog и Animal върху тази препратка Dog (към BigDog), но нито един от методите BigDog, освен ако не е бил заменен в BigDog.
Това, което Java проверява при извикване на метод, е: дали препратката (DOG) има препратката и дали обектът (BigDog) има отмяна. ако не, се извиква метод Dog, в противен случай се извиква метод BigDog.
Може ли някой да потвърди предположението ми?
dog2.greeting();
иdog3.greeting();
или добавете методpublic void greeting(Animal animal);
. След това изходният код ще се компилира. - person Pawel   schedule 30.08.2013