抽象类的一个方法调用同一抽象类的另一个方法.在这种情况下到底发生了什么


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((方法,其确切签名与Animaltest2((方法相同,因此调用了Cat类别方法。这个概念被称为方法覆盖。

简而言之,当我们尝试使用超类引用调用子类方法时,它首先检查子类中的方法,然后检查它的超类,依此类推

最新更新