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