当我尝试编译并运行以下代码时,它正在工作,我在控制台上看到“A”。
为什么呢?
在我看来(String ... args)它是相同的(String arg,String [] args)。
public class AFewMainExample {
public static void main(String... args) {
System.out.print("A");
}
public static void main(String args) {
System.out.print("B");
}
public static void main(String[] args, String arg) {
System.out.print("C");
}
public static void main(String arg, String[] args) {
System.out.print("D");
}
}
答案 0 :(得分:2)
这实际上是在JLS中指定的,§12.1.4:
方法
main
必须声明为public
,static
和void
。它必须指定一个形式参数(§8.4.1),其声明类型为String
数组。因此,可以接受以下任一声明:
<强>
public static void main(String[] args)
强><强>
public static void main(String... args)
强>
除了调用函数的方式之外,varargs类型和标准数组类型之间没有区别,如here所述。因此,varargs版本满足上面详述的所有标准,并作为有效的main
方法传递。显然,所有其他main
重载都不相等(否则会出现编译错误)。
答案 1 :(得分:1)
第一个签名是唯一一个匹配void main(String [] args)
的签名答案 2 :(得分:0)
每个main方法的参数(order(或)type(或))都是不同的,它们只留下一个带有真正主语法的main方法,所以没有问题。
如果添加以下main方法,您将看到编译时错误,因为现在有两种方法具有完全语法。
public static void main(String[] args) {
System.out.print("A");
}
阅读本教程以获取有关overloading的更多信息。
答案 3 :(得分:0)
主要问题是:
+ signature of main(String... args) is different for
- main(String[] args, String arg)
- main(String arg, String[] args)
+ main(String... args)
- not equals for main(String[] args, String[] args2)
- only for main(String[] args)
虽然我在以下示例中捕获了编译错误:
public class MainOverloadingExample4 {
void go(String s){
System.out.println("void go(String s)");
}
void go(String ... s){
System.out.println("void go(String ... s)");
}
void go(String s, String ... arr){
System.out.println("void go(String s, String ... arr){");
}
public static void main(String[] args) {
new MainOverloadingExample4().go("where I am?", "why I am here?");
}
}
方法go(String [])对于MainOverloadingExample类型
是不明确的