覆盖方法和奇怪的行为
Overriding methods and weird behavior
我有 2 个 class,其中一个扩展了第二个并覆盖了父类的一些方法。当我调用 fs.m(ff)
时,我得到了一个奇怪的结果,我不明白为什么会这样。 type First fs
不应该访问 class Second 方法,即使我们为它们分配了一个新的 Second 对象,除非我们像那样转换它 - (Second) fs.m(ff)
。谁能解释一下为什么这段代码会产生输出 "override"?
public class Main {
public static void main(String[] args) {
First ff = new First();
First fs = new Second();
Second ss = new Second();
System.out.println( fs.m(ff));
}
}
public class First {
public String m(First x){
return "default";
}
public String m(First x, First y){
return "default";
}
}
public class Second extends First{
public String m(Second x){
return "overload";
}
public String m(First x){
return "override";
}
public String m(First x, Second y){
return "???";
}
}
fs.m(ff)
调用的方法由fs
的运行时间类型决定。该 运行 时间类型是 Second
,并且由于 Second
覆盖了 public String m(First x)
方法,因此该方法被执行。
fs
可以访问在 First
class 中声明的方法,因为它是 First
类型,但在 运行 时间内,实际执行的方法取决于这些方法是否被分配给 fs
的实例的 运行 时间类型覆盖,即 Second
.
Fs实际上是指向一个Second Object(fs是对Second类型对象的引用)。
因此,当您调用 fs.m(ff) 时,由于动态绑定(覆盖),它实际上是在 Second 上调用对象。
我有 2 个 class,其中一个扩展了第二个并覆盖了父类的一些方法。当我调用 fs.m(ff)
时,我得到了一个奇怪的结果,我不明白为什么会这样。 type First fs
不应该访问 class Second 方法,即使我们为它们分配了一个新的 Second 对象,除非我们像那样转换它 - (Second) fs.m(ff)
。谁能解释一下为什么这段代码会产生输出 "override"?
public class Main {
public static void main(String[] args) {
First ff = new First();
First fs = new Second();
Second ss = new Second();
System.out.println( fs.m(ff));
}
}
public class First {
public String m(First x){
return "default";
}
public String m(First x, First y){
return "default";
}
}
public class Second extends First{
public String m(Second x){
return "overload";
}
public String m(First x){
return "override";
}
public String m(First x, Second y){
return "???";
}
}
fs.m(ff)
调用的方法由fs
的运行时间类型决定。该 运行 时间类型是 Second
,并且由于 Second
覆盖了 public String m(First x)
方法,因此该方法被执行。
fs
可以访问在 First
class 中声明的方法,因为它是 First
类型,但在 运行 时间内,实际执行的方法取决于这些方法是否被分配给 fs
的实例的 运行 时间类型覆盖,即 Second
.
Fs实际上是指向一个Second Object(fs是对Second类型对象的引用)。 因此,当您调用 fs.m(ff) 时,由于动态绑定(覆盖),它实际上是在 Second 上调用对象。