为什么超类会调用子类的重写方法?

时间:2013-08-18 14:10:06

标签: java

我有两个类,Parent(超类)和Child(子类)。

public class Parent(){

   public void hello(){
       System.out.println("HelloParent");
       bye();
   }

   public void bye(){
       System.out.println("ByeParent");
   }
}

public class Child extends Parent(){

   @Override
   public void hello(){
       super.hello();
   }

   @Override
   public void bye(){
       System.out.println("ByeChild");
   }
}

如果我创建Child实例并调用其hello()方法,则会调用Child的{​​{1}}方法,而不是hello的方法Parent方法。

hello

输出:

Child c = new Child();
c.hello();

但为什么不是“ByeParent”?

为什么不调用超类的方法?

3 个答案:

答案 0 :(得分:2)

无论代码在何处,任何实例方法调用都将发生在实例所属的对象上。因此,在执行此代码时:

 public void hello(){
       System.out.println("HelloParent");
       bye();
   }
将在调用对象bye上调用

Child方法,因此调用Child方法。

答案 1 :(得分:1)

嗯,这就是多态性在OO中的工作原理。由于您使用的实例是Child,因此调用Child.bye()就不足为奇了!

如果您真的希望它打印ByeParent,那么您必须在bye()中写下Child,如下所示:

@Override
public void bye(){
    super.bye();
    System.out.println("ByeChild");
}

请注意,您也可以这样做:

Parent obj = new Child();
obj.hello();

但是,即使在这种情况下,它仍会打印ByeChild

答案 2 :(得分:1)

覆盖一个方法完全取代它,它不会添加它。如果您还想调用原始方法,则需要使用关键字“super”显式调用它:

@Override
public void bye(){
    super.bye();
    System.out.println("ByeChild");
}