困惑Java继承规则[重复]

问题描述 投票:0回答:1

这个问题在这里已有答案:

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

我没有得到语义

One hybrid = new Two();

我的理解是Java在这种情况下执行所谓的upcasting。即使hybrid被声明为One的一个实例,编译器也将它转换为Two实例。

它是否正确?

因此,在#3,它调用了foo的方法Two。到现在为止还挺好。

在#5事情对我来说变得神秘:

为什么在地球上编译器调用barOne方法而不是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

实际输出:

One-foo
Two-foo
Two-foo
One-bar Two-foo
One-bar Two-foo
One-bar Two-foo
java inheritance polymorphism
1个回答
2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.