fro*_*die 23 java program-entry-point variadic-functions
我有一个关于Java main声明的语法的问题:
public static void main (String[] args)
Run Code Online (Sandbox Code Playgroud)
由于在调用main函数时可以传递可变数量的字符串,这不应该是变量长度参数列表而不是数组吗?为什么使用字符串参数列表对此方法进行命令行调用甚至可以工作?(除非有幕后处理用字符串列表构建数组,然后将该数组传递给main方法......?)主要声明不应该更像这样......? -
public static void main(String... args)
Run Code Online (Sandbox Code Playgroud)
Hen*_*ing 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");
}
}
Run Code Online (Sandbox Code Playgroud)
Nea*_*ter 15
你可以用任何一种方式声明main,它运行得很好.没有"向后兼容"或"改造"问题.但是,您的代码的读者可能会发现它分散注意力,并且不太可能以任何方式改进您的程序.
Java语言规范(第三版)第8.4.1节说"如果最后一个形式参数是类型T的变量arity参数,则认为它定义了类型为T [] " 的形式参数.
Java程序如何启动的规范在JLS 12.2中,它引用了VM规范的第5章.该虚拟机规范第5.2节说,虚拟机调用一个公共类法" void main(String[])".由于VM规范没有变量arity的概念,因此使用" ..." 声明的main 满足要求.
主要方法是为Java 1.0设计的.
Java 1.5中引入了"..."语法
它是通过你定义的类型的数组实现的(我的猜测,但是......如果Java 1.4和1.5字节代码是兼容的,那么它必须用数组实现).
没有Java的主要方法,实际上你可以在主方法中将数组声明为vararg :
public static void main(String... args) { System.out.println("Hi!"); }
Run Code Online (Sandbox Code Playgroud)