24

main我对 Java声明的语法有疑问:

public static void main (String[] args)

由于在调用 main 函数时可以传递可变数量的字符串,所以这不应该是可变长度参数列表而不是数组吗?为什么使用字符串参数列表对该方法的命令行调用甚至可以工作?(除非有幕后处理使用字符串列表构建一个数组,然后将该数组传递给 main 方法......?) main 声明不应该更像这样......?-

public static void main(String... args) 
4

8 回答 8

41

main(String... args)并且main (String[] args)实际上是同一件事:你得到的是一个String数组。可变参数只是调用者的语法糖。

我猜你从不main()从代码中调用,所以在引入可变参数时它没有被改造。

编辑:实际上,划掉最后一句话。main(String... args)当然,这是完全有效的语法。这两种风格是完全可以互换的。这工作得很好:

public class Test {

    public static void main(String... args) {
        System.out.println("Hello World");
    }

}
于 2010-02-04T17:20:37.253 回答
16

你可以用任何一种方式声明 main ,它工作得很好。不存在“向后兼容性”或“改造”问题。但是,您的代码的读者可能会发现它会分散注意力,并且不太可能以任何方式改进您的程序。

Java 语言规范(第三版)第 8.4.1 节说“如果最后一个形参是T类型的可变参数,则认为它定义了T[]类型的形参”。

Java 程序如何启动的规范在JLS 12.2中,它引用了 VM 规范的第 5 章。VM 规范第5.2 节说 VM 调用公共类方法“ void main(String[])”。由于 VM 规范没有变量数量的概念,因此使用 " ..." 声明的 main 满足要求。

于 2010-02-04T17:47:13.260 回答
9

main 方法是为 Java 1.0 设计的。

“...”语法是在 Java 1.5 中引入的

它是通过您定义的类型的数组实现的(我猜,但是......如果 Java 1.4 和 1.5 字节代码兼容,那么它必须用数组实现)。

于 2010-02-04T17:21:18.403 回答
6

没有Java 的 main 方法,实际上您可以在main 方法中将数组声明为 vararg :

public static void main(String... args) { System.out.println("Hi!"); }
于 2010-02-04T17:27:34.050 回答
1

主要声明不应该更像这样吗......?

public static void main(String... args) 

实际上,这可以毫无问题地完成。

那是String [] args在引入 var args 之前,但现在两者都有效。

于 2010-02-04T17:41:29.170 回答
1

java 主要语法早于 varargs,后者仅在 java 1.5 中引入。

于 2010-02-04T17:21:20.217 回答
0

好吧,第二种语法只是第一种语法的变体,是的,它会很好,但目前它还没有内置到 Java 中

于 2010-02-04T17:21:22.037 回答
-2

你为什么在乎?没有人手动调用 main 方法。它是 Java 内部的。

编辑:我想现在没关系,因为您可以将 main 方法定义为:

public static void main(String... args);

我的观点仍然有效,因为没有人明确调用 main。

于 2010-02-04T17:23:28.090 回答