public class DemoParent {
public void m1(int i) {
System.out.println("parent");
}
}
public class DemoChild extends DemoParent{
public void m1(int... i) {
System.out.println("child");
}
public static void main(String[] args) {
DemoParent p = new DemoChild();
p.m1(10);
DemoChild c = new DemoChild();
c.m1(10);
}
}
这里,我有两个类DemoParent和DemoChild扩展了DemoParent,在DemoParent中,我具有通用方法m1(int i),但在DemoChild中,我具有varargs方法m1(int ... i)。当我创建子类的对象并调用m1方法时,它给了我父类方法输出。参见下面的输出。 父母 父母
谁能解释我为什么子级引用总是调用子类引用的父类方法?
但是如果我们反转代码,即父类具有varargs方法而子级具有常规方法,则它将充当重载而不是Overriding。所以输出是 o / p-父级 子
但是在上述第一种情况下,我不明白为什么总是总是从子引用调用父类方法。
答案 0 :(得分:1)
您没有压倒一切。您超载。
DemoChild
有两个称为m1
的方法,它必须基于传递单个int
作为参数的事实来选择要调用的方法。>
non-varargs方法将始终在varargs重载之前被匹配,因为围绕方法调用的语言规范规则说它将是(以保持与pre-varargs代码的向后兼容性)。