这个问题在这里已有答案:
在下面的代码中,我有以下问题:
我没有得到语义
One hybrid = new Two();
我的理解是Java在这种情况下执行所谓的upcasting。即使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)
。