谢谢你们所有人。实际上有人为该课程添加了一个扰乱正确行为的补丁。 最后我通过检查类加载器找到了这个。 原谅我:)
此处public class Son
延伸public class Parent
延伸public class GrandParent
在Parent中,此方法会覆盖GrandParent:
@Override
public String getSomething() {
return "blabla";
}
在Son中,相同的方法会覆盖Parent:
@Override
public String getSomething() {
return null;
}
奇怪的是,当我运行声明为GrandParent并构造为Son的对象的getSomething()时,它进入Parent的代码并返回“blabla”而不是null。
之前有没有人见过这个问题?谁能对此作出解释?感谢。
答案 0 :(得分:3)
如果您尝试这个简单的代码:
public class GrandParent
{
public String f() {
return "grand parent";
}
}
public class Parent extends GrandParent
{
@Override public String f() {
return "parent";
}
}
public class Son extends Parent
{
@Override public String f() {
return "son";
}
}
public class Test
{
public static void main(String[] args) {
GrandParent p = new Son();
System.out.println(p.f());
}
}
你会看到打印出来的字符串是"son"
。你在代码中做错了。
答案 1 :(得分:0)
它甚至可以在父实例签出时使用:
public class Parent {
public String getSomething()
{
return "parent";
}
}
public class Son extends Parent {
@Override
public String getSomething() {
return "son";
}
public static void main(String[] args) {
Son son = new Son();
System.out.println(son.getSomething());
Parent par = (Parent)son;
System.out.println(par.getSomething());
}
}
结果:
son
son