class Dad {
private static final String me = "dad";
protected String getMe() {
return me;
}
protected void printMe() {
System.out.println(getMe());
}
}
class Son extends Dad {
private static final String me = "son";
protected void printMe() {
System.out.println(getMe());
}
}
class Test {
public static void main(String[] args) {
Son son = new Son();
son.printMe();
}
}
在这种情况下,“ Son”类型的引用“ son”并且由于方法printMe()是非静态的,因此将执行来自类Son的方法的代码。
但是,由于Son类尚未重新定义方法getMe(),因此将执行祖先类中的方法代码。
所以我们得到“爸爸”。
第二种情况:
class Dad {
private static final String me = "dad";
protected String getMe() {
return me;
}
protected void printMe() {
System.out.println(getMe());
}
}
class Son extends Dad {
private static final String me = "son";
protected String getMe() {
return me;
}
class Test {
public static void main(String[] args) {
Son son = new Son();
son.printMe();
}
}
在这种情况下,Son类没有以类似的方式进行推理,因此未执行方法重新定义printMe(),因此应执行类Dad中方法printMe()的代码。
但是我们得到“儿子”。为什么?
然后继承呢?也就是说,如果继承人没有覆盖祖先的方法,那么他们一起共享祖先的方法的代码吗?
最佳答案
在第一种情况下,son.printMe()
调用Son
的printMe()
(因为Son
覆盖该方法),后者调用Dad
的getMe()
(因为Son
没有覆盖该方法),这返回“爸爸”。
在第二种情况下,son.printMe()
调用Dad
的printMe()
(因为Son
没有覆盖该方法),由于Son
覆盖了该方法,因此调用getMe()
的Son
。因此,“儿子”被打印。