重写方法和奇怪的行为

时间:2015-02-01 12:53:19

标签: java inheritance override overloading

我有两个类,一个扩展第二个类并覆盖父类的一些方法。当我打电话给fs.m(ff)时,我得到了一个奇怪的结果,我无法弄清楚为什么会这样。类型First fs不应该有类第二种方法的访问权限,即使我们为它们分配了一个新的第二个对象,除非我们这样做 - (Second) fs.m(ff)。任何人都可以解释为什么这段代码产生输出“覆盖”?

public class Main {

    public static void main(String[] args) {
        First ff = new First();
        First fs = new Second();
        Second ss = new Second();

        System.out.println( fs.m(ff));
    }
}


public class First {
    public String m(First x){
        return "default";
    }

    public String m(First x, First y){
        return "default";
    }
}

public class Second extends First{
    public String m(Second x){
        return "overload";
    }

    public String m(First x){
        return "override";
    }

    public String m(First x, Second y){
        return "???";
    }
}

2 个答案:

答案 0 :(得分:3)

fs.m(ff)调用的方法由fs的运行时类型决定。该运行时类型为Second,并且由于Second会覆盖public String m(First x)方法,因此会执行该方法。

fs可以访问First类中声明的方法,因为它的类型为First,但在运行时,执行的实际方法取决于是否覆盖了这些方法按分配给fs的实例的运行时类型,即Second

答案 1 :(得分:0)

Fs实际上是指向第二个对象(fs是对Second类型对象的引用)。 因此,当你调用fs.m(ff)时,由于动态绑定(覆盖),它实际上是在Second上调用对象。