У меня есть вопрос о 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?
}
}
Я понимаю взаимосвязь между суперклассом/подклассом и тем, как работает приведение. Однако мой вопрос заключается в том, можете ли вы преобразовать суперкласс в конкретный подкласс, зная, что между ними есть класс? например, если у меня есть объект класса 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