2

我有两个类,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'hello方法,而不是Parent'hello方法。

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

输出:

"HelloParent"
"ByeChild"

但是为什么不是“ByeParent”呢?

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

4

3 回答 3

2

无论代码在哪里,任何实例方法调用都将发生在实例所属的对象上。所以在执行这段代码时:

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

bye方法将在调用对象上被调用Child,因此 Child 方法被调用。

于 2013-08-18T14:11:42.583 回答
1

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

@Override
public void bye(){
    super.bye();
    System.out.println("ByeChild");
}
于 2013-08-18T14:15:06.177 回答
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.

于 2013-08-18T14:12:40.870 回答