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

one method of abstract class calling another method of same abstract class. what is exactly happening in this scenario?

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 class 的 test1 方法? 并且,为什么从 test1() 方法调用 test2() 方法解析为子 class 的 test2() 方法?

我试图从中理解,但理解不多。

这是由于 Method Overriding 的概念而发生的。

声明

Animal a = new Cat();

Cat 类型的对象分配给 Animal 类型的引用。 当语句

a.test1();

被执行。运行时环境推断 a 的类型是 Cat。由于 Cat class 没有定义自己的 test1() 方法,它调用从动物 class.

类似地,当遇到对 test2() 的调用时,首先检查 Cat class 方法。因为,Cat class 有一个 test2() 方法,其签名与 test2() Animalclass的方法,调用了Catclass方法。这个概念被称为方法覆盖。

简而言之,当我们尝试调用 subclass 方法时,使用 superclass 引用,它首先检查 subclass 中的方法,然后它的superclass 等等.