我有两个类,一个扩展第二个类并覆盖父类的一些方法。当我打电话给fs.m(ff)
时,我得到了一个奇怪的结果,我无法弄清楚为什么会这样。类型First fs
不应该有类第二种方法的访问权限,即使我们为它们分配了一个新的第二个对象,除非我们这样做 - (Second) fs.m(ff)
。任何人都可以解释为什么这段代码产生输出“覆盖”?
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 "???";
}
}
答案 0 :(得分:3)
为fs.m(ff)
调用的方法由fs
的运行时类型决定。该运行时类型为Second
,并且由于Second
会覆盖public String m(First x)
方法,因此会执行该方法。
fs
可以访问First
类中声明的方法,因为它的类型为First
,但在运行时,执行的实际方法取决于是否覆盖了这些方法按分配给fs
的实例的运行时类型,即Second
。
答案 1 :(得分:0)
Fs实际上是指向第二个对象(fs是对Second类型对象的引用)。 因此,当你调用fs.m(ff)时,由于动态绑定(覆盖),它实际上是在Second上调用对象。