我有两个类,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”?
为什么不调用超类的方法?
答案 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");
}