我最近遇到过一个关于java中多级继承的问题,问题如下:
public class Test{
public static void main(String[] args) {
A c = new C();
c.print();
}
}
class A{
public void print(){
System.out.println("Inside A");
}
}
class B extends A{
@Override
public void print(){
System.out.println("Inside B");
}
}
class C extends B{
}
所以我的问题是为什么打印为" Inside B" 。因为C类没有覆盖方法print(),因此它应该根据编译时间解析方法,因此应该打印"在A" 内。如果我遗漏任何东西,请告诉我。谢谢你的帮助。
答案 0 :(得分:5)
C扩展B,这意味着它将具有与B相同的方法,并且在这种情况下B已经覆盖了该方法,因此C也将拥有它。
答案 1 :(得分:1)
它的印刷"内部B"因为那是C正在扩展的类,而B是C的超类。
答案 2 :(得分:1)
你混淆了两件事。
如果方法被重写一次或多次,则将运行最具体子类中的版本。这就是为什么B
中的版本是使用的版本。
另一方面,在重载方法之间进行选择时,决定是基于参数的编译时类型。
答案 3 :(得分:1)
c
的类型为A
,但A
本身已初始化为C
的实例,自C
扩展B
后B
覆盖A
内的B
和C
覆盖方法A
。但由于C
未覆盖B
,因此使用的方法来自B。
不得不说,这是非常整洁的大脑运动。
答案 4 :(得分:1)
根据Java中的继承定律,基类中的所有函数都由派生类使用,包括被重写的类。从中间继承的类继承的任何类都将采用重写的定义。这是不言而喻的,因为这些重写的函数会覆盖继承层次结构中的任何函数定义。因此,重写的函数充当其下任何派生类的基类定义。