对Java继承规则感到困惑

时间:2019-02-18 13:02:27

标签: java inheritance polymorphism

在下面的代码中,我遇到以下问题:

我不了解

的语义

One hybrid = new Two();

我的理解是Java在这种情况下执行了所谓的向上转换。 即使将hybrid声明为One的实例,编译器也将其强制转换为Two实例。

这正确吗?

因此,它在#3处调用foo的方法Two。到目前为止一切顺利。

在#5处,对我来说,事情变得越来越神秘了

到底为什么编译器会调用bar的{​​{1}}方法而不是One?我在这里想念什么?

谢谢

马塞尔

Two

与下面的输出相比,我希望得到以下输出:

class One {
  public One() {}
  public String foo() {return "One-foo";}
  public String bar(One o) {return "One-bar " + o.foo();}
};

class Two extends One {
  public Two() {}
  public String foo() {return "Two-foo";}
  public String bar(Two t) {return "Two-bar " + t.foo();}
};

class Main {
  public static void main(String[] args) {
    One one = new One();
    Two two = new Two();
    One hybrid = new Two();

    System.out.println(one.foo());        // #1 One-foo
    System.out.println(two.foo());        // #2 Two-foo
    System.out.println(hybrid.foo());     // #3 Two-foo

    System.out.println(one.bar(two));     // #4 One-bar Two-foo
    System.out.println(hybrid.bar(two));  // #5 One-bar Two-foo
    System.out.println(two.bar(hybrid));  // #6 One-bar Two-foo
  }
}

实际输出:

One-foo
Two-foo
Two-foo
One-bar Two-foo
Two-bar Two-foo
Two-bar Two-foo

1 个答案:

答案 0 :(得分:2)

String bar(Two t)不会覆盖String bar(One o)