由于动态方法调度,在使用超类引用创建对象并通过该对象调用已在子类中覆盖的方法时,将调用子类中被覆盖的方法而不是超类中的原始方法。如果被覆盖的方法在另一个子类中再次被覆盖,会发生什么情况?
例如,假设 A 是父类,B 扩展 A,C 扩展 B。假设方法 void m1() 已在 A 中编写,然后在 B 中被覆盖,然后在 C 中再次被覆盖。现在如果我们创建和一个对象如下-
A obj = new B();
obj.m1();
将调用哪个方法?B中的那个还是C中的那个?
由于动态方法调度,在使用超类引用创建对象并通过该对象调用已在子类中覆盖的方法时,将调用子类中被覆盖的方法而不是超类中的原始方法。如果被覆盖的方法在另一个子类中再次被覆盖,会发生什么情况?
例如,假设 A 是父类,B 扩展 A,C 扩展 B。假设方法 void m1() 已在 A 中编写,然后在 B 中被覆盖,然后在 C 中再次被覆盖。现在如果我们创建和一个对象如下-
A obj = new B();
obj.m1();
将调用哪个方法?B中的那个还是C中的那个?
您总是可以自己尝试,但答案非常简单:B
将调用 ' 方法。
class A {
public static void main(String a[]) {
A obj = new B();
obj.m();
}
void m() {
System.out.println("It's A");
}
}
class B extends A {
@Override
void m() {
System.out.println("It's B");
}
}
class C extends B {
@Override
void m() {
System.out.println("It's C");
}
}
执行此程序将打印It's B
. 请注意,位置main
无关紧要。
经过一番思考,应该清楚 »C
的方法将被称为« 不能是答案;class C2 extends B
如果是,添加另一个覆盖方法后会调用哪个方法void m()
?
一般来说,如果您有obj.m(arguments)
并且想要找出哪些m
将被执行,请使用以下步骤:
obj
(在这种情况下B
)的运行时类型。m(type of arguments)
。