由于动态方法分派,在使用超类引用创建对象并通过此对象调用已在子类中重写的方法时,将调用子类中被重写的方法,而不是超类中的原始方法。如果重写的方法又在另一个子类中被重写,将会是什么情况?
例如,假设A是父类,B扩展了A,C扩展了B。假设在A中编写了一个方法void m1(),然后在B中对其进行了覆盖,然后在C中对其进行了覆盖。我们创建一个对象,如下所示-
A obj = new B();
obj.m1();
将调用哪个方法? B中的一个或C中的一个?
答案 0 :(得分:0)
您总是可以自己尝试,但是答案非常简单:将调用 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)
。