这段代码让我有点困惑
基类:
public class BaseClass {
public void g(){
System.out.print("g in BaseClass\n");
}
public void m(){
System.out.print("m in BaseClass\n");
g();
}
}
继承的类:
public class WhenInheriting extends BaseClass{
public void g(){
System.out.print("g in WhenInheriting\n");
super.g();
}
}
这是主要的地方:
public class MainIsHere {
public static void main(String[]args){
WhenInheriting wi= new WhenInheriting();
wi.g();
wi.m();
}
}
结果:
所以,O.K。调用来自g()
的第一个WhenInheriting
,然后通过super.g()
调用BaseClass'g()
。
调用m()
时,方法g()
将从其正文中调用。但不像我期望g()
成为BaseClass中的方法,g()
原来是来自WhenInheriting类的方法。
我可以对此做出一些逻辑:也许当m()
说打印并调用g()
时,因为引用只知道一个g()
,即方法{{1}从继承类中,调用一个。
现在我想知道如何编写代码,以便在g()
类调用m()
时,WhenInhereting
将通过它调用g()
g()
来自BaseClass?
我尝试在super.g()
中写m()
而不是仅g()
,但这是不允许的。
答案 0 :(得分:1)
这就是多态性的全部意义所在。对象的具体类型为WhenInheriting
,因此将调用的多态g()
方法始终为WhenInheriting.g()
方法。
这就像真实的物体。让我们说你有一个size()
为20的Box,并创建一个size()
为40的BigBox子类。假设我问你一个盒子,你给我一个大盒子。它的size()
将是40.即使我认为这个BigBox是一个盒子,甚至不知道它是一个特殊的盒子,实际上是一个BigBox。
如果希望基类调用方法并确保子类不覆盖它,则它不应该是可覆盖的。所以它应该调用另一个私有或最终的方法g2()
。
答案 1 :(得分:0)
正在调用g()
的{{1}}因为子类中的方法总是覆盖父类的方法。
如果您想要调用的父类whenInheriting
,只需将g()
实例化为wi
的实例。