在下面的代码中我遇到以下问题:
我不明白的语义
One hybrid = new Two();
我的理解是,Java 在这种情况下执行所谓的向上转换。
那即使hybrid
被声明为 One
的实例编译器将其转换为 Two
实例。
这是正确的吗?
因此在 #3 处它调用方法 foo
的Two
。到目前为止一切顺利。
在#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/