用string [] args和varargs重载主方法是否可能?如果没有那么为什么?我试过下面给出编译错误的代码.请帮助.im新增java.
public class obj1 {
public static void main(String ... args) {
System.out.println("main method varargs");
}
public static void main(String[] args) {
System.out.println("main method string arrays");
}
}
Run Code Online (Sandbox Code Playgroud)
在Java中,这两种方法都是public static void main(String[] args)(基本上).这就是为什么它不会编译; 你不能有一个有两种public static void main(String[])方法的课.
Java通过将函数编译为接受数组来添加可变参数,然后通过调用函数自动将可变参数包装在数组中.
也就是说,如果我们有
void foo(String... args)
Run Code Online (Sandbox Code Playgroud)
打电话给
foo("one", "two", "three");
Run Code Online (Sandbox Code Playgroud)
编译器实际创建的是什么
void foo(String[] args)
Run Code Online (Sandbox Code Playgroud)
打电话给
foo(new String[] { "one", "two", "three"})
Run Code Online (Sandbox Code Playgroud)
(编译器在类文件中标记该方法,以便稍后知道末尾的数组是可变参数,但它创建的代码是接受数组的方法.)
这主要由JLS§8.4.1涵盖:
方法或构造函数的最后一个形式参数是特殊的:它可以是一个变量arity参数,由类型后面的省略号表示.
...
形式参数的声明类型取决于它是否是变量arity参数:
如果形式参数不是变量arity参数,则如果UnannType和VariableDeclaratorId中没有出现括号对,则声明的类型由UnannType表示,否则由§10.2指定.
如果形式参数是变量arity参数,则声明的类型由§10.2指定.(注意,变量arity参数不允许使用"混合符号".)
...其中§10.2正在讨论数组.
实际上,foo(String...)使用数组而不是离散参数调用方法是完全有效的.例如,假设我们有:
private static void foo(String... args) {
for (String s : args) {
System.out.println(s);
}
}
Run Code Online (Sandbox Code Playgroud)
我们可以这样称呼:
foo("one", "two", "three");
Run Code Online (Sandbox Code Playgroud)
或者像这样
foo(new String[] { "four", "five", "six"});
Run Code Online (Sandbox Code Playgroud)
两者都完全有效; 例如:http://ideone.com/a1Ku37