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

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)

  • 那么当你从命令行执行一个程序时,你实际上并没有直接调用main?在main执行之前会发生一些处理吗?(即从传递的字符串构建数组) (4认同)
  • "永远不要调用main()FROM CODE":).和不.您无法从命令行调用Java方法.实际上命令行是一个程序,它解析你的命令,告诉操作系统用一堆args执行某个程序,并且该程序(例如java.exe)将大量内容加载到内存中(类定义等),创建一个Java友好的系统程序执行表示接收命令行,最后调用main方法.所以不行.你实际上并没有直接打电话给主要人员. (4认同)
  • 您没有使用Java调用main()方法.运行时为您调用它. (3认同)
  • 当然,您可以从代码中调用"main",这样做可能非常有意义.例如,考虑一个Java实用程序来调用一系列一个或多个类中的"main".你会怎么写的?另一个例子是编写绑定到现有Java(命令行)实用程序的Ant任务. (3认同)
  • 我想从代码中调用main方法进行单元测试! (3认同)
  • 我对从代码中调用 main 没有太多意见——它看起来不像是你想做的事情,但在某些情况下它应该是完全有效的(例如,导致一个程序运行来自另一个实体或作为它自己的实体)。@helios 你有现实生活中的经验,甚至有理论例子来说明这是一个问题吗? (2认同)

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 满足要求.


hel*_*ios 9

主要方法是为Java 1.0设计的.

Java 1.5中引入了"..."语法

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


Fab*_*eeg 6

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

public static void main(String... args) { System.out.println("Hi!"); }
Run Code Online (Sandbox Code Playgroud)

  • Varargs在Java 5中被引入作为数组的语法糖,这意味着它们隐藏了实际的数组,但是在下面,它是同一个东西,这就是为什么这样做的原因.另见http://java.sun.com/j2se/1.5.0/docs/guide/language/varargs.html (5认同)