我有一些关于向上/向下的问题。
我创建了一个抽象超类 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 引用(对 BigDog)的所有 Dog 和 Animal 方法,但不能调用 BigDog 方法,除非它在 BigDog 中被覆盖。
Java 在调用方法时检查的是:引用 (DOG) 是否具有引用,以及对象 (BigDog) 是否具有覆盖。如果不是,则调用 Dog 方法,否则调用 BigDog 方法。
谁能证实我的猜测?