一个抽象方法 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 等等.
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 等等.