覆盖方法为varargs,覆盖方法为常规方法

时间:2020-05-13 08:02:27

标签: java

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-父级 子

但是在上述第一种情况下,我不明白为什么总是总是从子引用调用父类方法。

1 个答案:

答案 0 :(得分:1)

您没有压倒一切。您超载。

DemoChild有两个称为m1的方法,它必须基于传递单个int作为参数的事实来选择要调用的方法。

non-varargs方法将始终在varargs重载之前被匹配,因为围绕方法调用的语言规范规则说它将是(以保持与pre-varargs代码的向后兼容性)。