首页 > 解决方案 > 对 Java 继承规则感到困惑

问题描述

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

我不明白的语义

One hybrid = new Two();

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

这个对吗?

因此在# 3 它调用foo. Two到目前为止,一切都很好。

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

为什么编译器调用bar方法 ofOne而不是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

标签: javainheritancepolymorphism

解决方案


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


推荐阅读