(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
。 如果您在Beta
的foo
声明中使用了@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)
。
结论:问题的答案是否定的,因为子类中的方法与父类的方法具有不同的方法签名,所以不会覆盖它。