为什么Java的主要不使用变长参数列表?

时间:2010-02-04 17:17:22

标签: java main variadic-functions

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

public static void main (String[] args)

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

public static void main(String... args) 

8 个答案:

答案 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。