从基类调用重新定义的方法?

时间:2013-12-01 15:06:45

标签: java inheritance

这段代码让我有点困惑

基类:

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();
        }
}

结果:

  • g in WhenInheriting
  • g in BaseClass
  • m in BaseClass
  • g in WhenInheriting
  • g in BaseClass

所以,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(),但这是不允许的。

2 个答案:

答案 0 :(得分:1)

这就是多态性的全部意义所在。对象的具体类型为WhenInheriting,因此将调用的多态g()方法始终为WhenInheriting.g()方法。

这就像真实的物体。让我们说你有一个size()为20的Box,并创建一个size()为40的BigBox子类。假设我问你一个盒子,你给我一个大盒子。它的size()将是40.即使我认为这个BigBox是一个盒子,甚至不知道它是一个特殊的盒子,实际上是一个BigBox。

如果希望基类调用方法并确保子类不覆盖它,则它不应该是可覆盖的。所以它应该调用另一个私有或最终的方法g2()

答案 1 :(得分:0)

正在调用g()的{​​{1}}因为子类中的方法总是覆盖父类的方法。

如果您想要调用的父类whenInheriting,只需将g()实例化为wi的实例。