abstract class Animal {
public void test1() {
System.out.println(" Animal test1");
test2();
}
public void test2() {
System.out.println(" Animal test2");
}
}
class Cat extends Animal {
@Override
public void test2() {
System.out.println(" Cat Test2 ");
}
}
public class MyClass {
public static void main(String [] args) {
Animal a = new Cat();
a.test1();
}
}
所以,
为什么第一个调用是Animal类的test1方法?为什么test1((方法调用的test2((方法会解析为子类的test2(方法?
我试图从真实类中同名的抽象类中的另一个方法中理解Call方法,但不能理解太多。
这是因为方法重写的概念。
声明
Animal a = new Cat();
将猫类型的对象分配给动物的引用。当语句
a.test1();
执行。运行时环境推断a的类型,即Cat。由于Cat类没有定义自己的test1((方法,因此它调用从Animal类别继承的方法。
类似地,当遇到对test2((的调用时,首先检查Cat类方法。由于Cat类有一个test2((方法,其确切签名与Animal的test2((方法相同,因此调用了Cat类别方法。这个概念被称为方法覆盖。
简而言之,当我们尝试使用超类引用调用子类方法时,它首先检查子类中的方法,然后检查它的超类,依此类推