我对Java main
声明的语法有疑问:
public static void main (String[] args)
由于在调用main函数时可以传递可变数量的字符串,这不应该是变量长度参数列表而不是数组吗?为什么使用字符串参数列表对此方法进行命令行调用甚至可以工作? (除非有幕后处理用字符串列表构建数组,然后将该数组传递给main方法......?)主要声明不应该更像这样......? -
public static void main(String... args)
答案 0 :(得分:40)
main(String... args)
和main (String[] args)
实际上是相同的:您获得的是String
数组。 varargs只是调用者的语法糖。
我猜你从不从代码中调用main()
,因此在引入varargs时没有对其进行改造。
编辑:实际上,抓住最后一句话。当然,main(String... args)
是完全有效的语法。这两种风格完全可以互换。这很好用:
public class Test {
public static void main(String... args) {
System.out.println("Hello World");
}
}
答案 1 :(得分:15)
你可以用任何一种方式声明main,它运行得很好。没有“向后兼容”或“改造”问题。但是,您的代码的读者可能会发现它分散注意力,并且不太可能以任何方式改进您的程序。
The Java Language Specification (third edition) section 8.4.1说“如果最后一个形式参数是 T 类型的变量arity参数,则认为它定义了一个类型为 T []的形式参数”。
Java程序如何启动的规范在JLS 12.2中,它引用了VM规范的第5章。 VM spec section 5.2表示VM调用公共类方法“void main(String[])
”。由于VM规范没有变量arity的概念,因此使用“...
”声明的main满足要求。
答案 2 :(得分:9)
主要方法是为Java 1.0设计的。
Java 1.5中引入了“...”语法
它是通过你定义的类型的数组实现的(我的猜测,但是......如果Java 1.4和1.5字节代码是兼容的,那么它必须用数组实现)。
答案 3 :(得分:6)
没有 Java的主要方法,实际上你可以在你的主方法中将数组声明为vararg:
public static void main(String... args) { System.out.println("Hi!"); }
答案 4 :(得分:1)
java主语法早于varargs,它只在java 1.5中引入。
答案 5 :(得分:1)
主要宣言不应该更像这样吗?
public static void main(String... args)
实际上,这可以毫无问题地完成。
引入var args之前是String [] args
,但现在两者都有效。
答案 6 :(得分:0)
嗯,第二种语法只是1st的变体,是的,它会很好但是此时它还没有内置到Java中
答案 7 :(得分:-2)
为什么要关心?没有人手动调用主方法。它是Java内部的。
编辑:我想现在无关紧要,因为你可以将main方法定义为:
public static void main(String... args);
我的观点仍然有效,因为没有人明确地调用main。