(String ... args)的值如何影响子类覆盖?

时间:2015-09-24 16:27:40

标签: java method-overriding

如果一个Alpha类的参数方法为public void foo(String... args)&尝试通过说public void foo(String a)在子类Beta中覆盖相同的方法。并创建一个参考对象&实例化为子类Beta&试图从Alpha访问foo方法。它从Alpha类返回值而不是Beta Sub-class的值。

不应该将BETA类的值作为其初始化&分配了Beta类对象?

有什么区别b / w Method(String ... args)& Method(String a)

3 个答案:

答案 0 :(得分:2)

这是因为Beta中的方法覆盖Alpha中的方法,因为它没有相同的形式参数。 String...String不同,与String[]String不同的方式非常相似。

答案 1 :(得分:1)

一个参数为String的方法会覆盖一个参数为String...的方法。参数类型String...是一个变量arity方法,意味着可以传递0个或多个参数,例如foo("one", "two", "three")。在方法的主体中,它被视为一个数组,而不是单个String。如果您在@Override的{​​{1}}声明中使用了Beta,则编译器会发现您没有覆盖foo。您已经重载了foo

要覆盖方法,必须使参数和方法名称完全匹配。实际上,由于调用方法的方式,即使参数都被视为数组,你甚至不能将类型设为foo

答案 2 :(得分:1)

当子类尝试使用以下方法实现方法时,会发生

方法重写

  • 与父类
  • 中的方法相同的方法签名
当多于1个方法使用相同的方法名但具有不同的方法签名时,会发生

方法重载(方法重载可以在同一个类中进行,即不需要子类化)

方法签名包括

  • 方法名称
  • 方法参数列表

<强>不包括

  • 方法返回类型
  • 访问修饰符(public / protected / private)
  • 其他修饰符(final / static / etc ..)

<强> PROOF

您实际上可以轻松测试自己的问题:

class Parent{
    public void doWork(String s1, String s2){
        System.out.println("From Parent");
    }
}

class Child extends Parent{
    @Override   //<-This will tell you whether it successfully overridden or not
    public void doWork(String s1){
        System.out.println("From Child");
    }
}

输出?

这将是一个错误。因为您告诉 Child 类从Parent重写方法doWork(String)。但是在Parent类中找不到这样的方法。 类只有一种称为doWork(String, String)的方法。

<强>结论: 回答你的问题是否定的, 不会被覆盖 ,因为来自子类的方法与父类具有不同的方法签名&#39;方法