我有以下java代码。
class A {
public void method1() {
System.out.println("A 1");
method2();
}
public void method2() {
System.out.println("A 2");
}
}
class B extends A {
@Override
public void method2() {
System.out.println("B 2");
}
}
public class Tester {
public static void main(String[] args) {
A a = new B();
a.method1();
}
}
打印
A 1
B 2
- 调用 a.method1() 时,运行时到底发生了什么?
- 如何从父级调用派生方法?
- 是否查看对象和方法名称字符串并调用 运行时的方法?
- 它默认调用 this.method2() 吗?
最佳答案
由于方法 method1(...)
从未被重写,因此 B 继承了 A 的 method1()
并且调用它就像在 B 中定义一样。
由于 method1()
调用 method2()
,因此在创建实例时,会调用 B 中定义的重写方法 method2()
B 构造函数。
如果使用 A 构造函数创建另一个实例,则不会获得 B 中定义的重写的 method2(...)
,而是获得原始的 method2(...)
在 A 中定义。
关于Java方法访问运行时多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47996412/