java - 对Java继承规则的困惑

标签 java inheritance polymorphism

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

我不明白的语义

One hybrid = new Two();

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

这是正确的吗?

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

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

到底为什么编译器要调用 bar方法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

实际输出:

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

最佳答案

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

关于java - 对Java继承规则的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54747956/

相关文章:

Java:删除 Runnable Canvas 组件

java - 从 PDF 中提取的图像水平碎片化

c++ - 如何从继承的子类访问基类中的私有(private)成员 (C++)

java - 在 eclipse luna 中使用 JGit 时出现 NoClassDefFoundError

java - 远程对象(flex)和自定义对象的ArrayList

c++ - 在 C++ 中处理指向层次结构中成员函数的指针

Java:扩展内部类

postgresql - 从 PL/pgSQL 函数返回具有未知列的动态表

Haskell 无法匹配类型,声称是刚性变量

haskell - Haskell 中的变量关联类型/数据类型