【问题标题】:Overriding methods and weird behavior重写方法和奇怪的行为
【发布时间】:2015-02-01 12:53:18
【问题描述】:

我有 2 个类,一个扩展了第二个并覆盖了父类的一些方法。当我打电话给fs.m(ff) 时,我得到了一个奇怪的结果,我不知道为什么会这样。类型 First fs 不应该访问类 Second 方法,即使我们为它们分配了一个新的 Second 对象,除非我们像那样转换它 - (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 "???";
    }
}

【问题讨论】:

    标签: java inheritance overriding overloading


    【解决方案1】:

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

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

    【讨论】:

    • 啊,所以它在运行时与编译时的行为不同,在运行时它会检查可能性,而在编译时它永远不允许这样做(理所当然,呵呵)
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-01
      • 1970-01-01
      • 2010-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多