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

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

它不应该从BETA类返回值作为其初始化和分配的Beta类对象吗?

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

这是因为Beta中的方法没有覆盖Alpha中的方法,因为它没有相同的forms参数。 String...String ,很像String[]String

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

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

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

  • 与父类中的方法相同的方法签名

当多于1个方法使用相同的方法名但具有不同的方法签名时,会发生方法重载(方法重载可以在同一个类中发生,即不需要子类)

方法签名包括

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

不包括

  • 方法返回类型
  • 访问修饰符(公共/受保护/私有)
  • 其他修饰符(final / static / etc ..)

certificate

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

 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类中找不到这样的方法。 Parent类只有一个称为doWork(String, String)

结论:问题的答案是否定的,因为子类中的方法与父类的方法具有不同的方法签名,所以不会覆盖它。