通常Var arg方法使用相同的方法var arg方法覆盖,但在我的代码中,普通方法覆盖var args。
但总的来说,Var args方法应该只覆盖或被其他var args方法覆盖,这与Test.go(String[])
和A.go(String...)
不同。
但我得到了输出T.
class A{
public void go(String...s){
System.out.println("A");
}
}
class Test extends A {
public void go(String[] a){
System.out.println("T");
}
public static void main(String[] args){
A a = new Test();
a.go("dd");
}
}
输出:T
String[]
和String...
在某些情况下是等价的,所以go(String... s)
可以被go(String[] s)
覆盖。这是在java中指示数组的方法之一。
Varargs只是对同一类型的数组进行语法处理,它向编译器指示从这一点开始的一系列逗号分隔的参数应该被视为一个数组。从签名的角度来看,String[]
和String...
是相同的。例如,如果需要,可以将主方法定义为public static void main(String... args)
。
这两个声明都是等效的,因为Java编译器将varargs扩展为指定类型的数组。所以你有效地覆盖了go
方法。
看看https://www.journaldev.com/1257/java-varargs#how-java-varargs-work