java - 对 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
解决方案
String bar(Two t)
不会覆盖String bar(One o)
.
推荐阅读
- c# - Linq to Entities Group By 有一些没有元素的组
- javascript - 将按钮添加到 Javascript 倒计时
- java - 如果您想要接近其尾部的元素,LinkedList 是否从末尾开始搜索?
- dart - (Flutter) 如何在不按“完成”的情况下自动监听 TextField 中的变化?
- javascript - HTA - 提交表单后如何关闭 HTA
- android - 微调器未出现在菜单栏中
- text - 与 tf idf 和 chi square 合作后我必须做什么
- angular - 根据 Angular 中的场景执行 Typescript 函数
- android - 从文件选择器获取正确的路径
- mongodb - 比较 MongoDb 中的两个字段