Java覆盖方法不起作用

时间:2015-01-28 10:52:35

标签: java override classpath

谢谢你们所有人。实际上有人为该课程添加了一个扰乱正确行为的补丁。 最后我通过检查类加载器找到了这个。 原谅我:)

此处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。

之前有没有人见过这个问题?谁能对此作出解释?感谢。

2 个答案:

答案 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