当前位置: 首页 > 知识库问答 >
问题:

将方法重写为varargs,并且重写的方法是普通方法

翟宾实
2023-03-14
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方法时,它会给我父类方法输出。请参见下面的输出。o/p-母公司

有人能解释为什么父类方法总是从子类引用调用,即使子类具有相同的方法?

但是如果我们反向代码,即父类有varargs方法,子类有普通方法,那么它将作为重载而不是重写。所以输出是o/p-父子

但在上面的第一个场景中,我不明白为什么总是从子引用调用父类方法。

共有1个答案

任小云
2023-03-14

你没有超越。你超载了。

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

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

 类似资料:
  • subA类是A类的子类。我试图重写一个方法,但不知怎的,它不允许我重写它。为什么会这样?是因为参数中的参数吗? 读取错误消息: 名称冲突:subA中的add(E#1)和A中的add(E#2)具有相同的擦除,但两者都不重写另一个,其中E#1、E#2是类型变量: E#1扩展了subA类中声明的对象 E#2扩展了A类中声明的对象 超类A: 子类subA:

  • 重载子类中重写的方法,我是重载父方法还是重载子类方法? 我大体上理解什么是超载和超驰。 重载-同一方法在同一个类中有不同的参数和可能的返回类型。 重写-子类中的方法签名与父类中的方法签名相同,但实现不同。 方法B.a(INTX)是重载a.a还是重载B.a?

  • 在子类中如果创建了一个与父类中相同名称、相同返回值类型、相同参数列表的方法,只是方法体中的实现不同,以实现不同于父类的功能,这种方式被称为 方法重写(override),又称为 方法覆盖。当父类中的方法无法满足子类需求或子类具有特有功能的时候,需要方法重写。 子类可以根据需要,定义特定于自己的行为。既沿袭了父类的功能名称,又根据子类的需要重新实现父类方法,从而进行扩展增强。 在重写方法时,需要遵循

  • 我有一个库类中的案例,我想覆盖方法以减少我需要传递的参数数量以对其进行模式匹配。我这样做: 但我希望它只返回。这有什么问题?

  • 问题内容: 通用方法: 所需的覆盖方法: 实现此目的的Java语法是什么? 问题答案: 更好的设计是。

  • 本文向大家介绍为什么在重写 equals方法的同时必须重写 hashcode方法,包括了为什么在重写 equals方法的同时必须重写 hashcode方法的使用技巧和注意事项,需要的朋友参考一下 我们都知道Java语言是完全面向对象的,在java中,所有的对象都是继承于Object类。 其 equals 方法比较的是两个对象的引用指向的地址,hashcode 是一个本地方法,返回的是对象地址值。O