在下面的代码中,我遇到以下问题:
我不了解
的语义 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
答案 0 :(得分:2)
String bar(Two t)
不会覆盖String bar(One o)
。