java中的main方法为啥接受无效的String args

Posted

技术标签:

【中文标题】java中的main方法为啥接受无效的String args【英文标题】:main method in java why Accept invalid String argsjava中的main方法为什么接受无效的String args 【发布时间】:2014-06-22 15:13:45 【问题描述】:

我使用public static void main(String arg[]) 或创建了一个 Java 应用程序 public static void main(String[] arg)

但昨天我发现如果我用public static void main(String... args) 编译一个程序,这也完全可以正常工作。 为什么?

【问题讨论】:

相信你明白String[] args和String...args的相似之处 这不是无效的,这是一个可变参数;可变参数是数组的语法糖 好吧,它只是因为 String... 会将字符串转换为数组。所以它会正常工作。 :) 【参考方案1】:

这是因为String...会被转换成String[]

根据jls §8.4.1

可变参数方法的调用可能包含比形式参数更多的实际参数表达式。所有与变量 arity 参数之前的形式参数不对应的实际参数表达式都将被计算,并将结果存储到一个数组中,该数组将传递给方法调用。

在 Java 中声明 varargs 是编译时错误:

String... abc="abc","def";

这是因为varargs 可以作为方法签名中的最后一个参数,正如jls 中所说,varargs 将被评估并将结果存储在数组中,然后传递给方法

【讨论】:

【参考方案2】:

这是因为,

Datatype ... var_name 形式写的任何东西都只是 var args

它可以接受任意数量的该类型的参数。

所以它和数组一样。

例如:String ... args 等价于 String[] args

【讨论】:

【参考方案3】:

这称为可变长度参数,您可以发送任意数量的具有相同数据类型的参数。您可能会想到一个问题,“这些功能可以重载吗?”答案是肯定的。

该示例显示了 VARGS 的工作原理

public class VarargsTest // 计算平均值 public static double average( double... numbers ) double total = 0.0; // 初始化总计 // 使用增强的 for 语句计算总计 for ( double d : numbers ) total += d; 返回总数/numbers.length; // 结束方法平均值 public static void main( String args[] ) double d1 = 10.0; 双 d2 = 20.0; 双 d3 = 30.0; 双 d4 = 40.0; System.out.printf( "d1 = %.1f\nd2 = %.1f\nd3 = %.1f\nd4 = %.1f\n\n", d1, d2 , d3, d4 ); System.out.printf( "d1 和 d2 的平均值为 %.1f\n", average( d1, d2 ) ); System.out.printf( "d1, d2, d3 的平均值为 %.1f\n", average( d1, d2, d3 ) ); System.out.printf( "d1, d2, d3, d4 的平均值为 %.1f\n", average( d1, d2, d3, d4 ) ); // 结束 main // 结束类 VarargsTest

【讨论】:

以上是关于java中的main方法为啥接受无效的String args的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Java 程序需要“main()”方法?

如果给出无效响应,请重新运行 main 方法?

为啥我们允许在 java 中有一个最终的 main 方法?

java - 为啥main方法没有转换为java中的守护线程[重复]

java中为啥要把main方法定义为一个static方法

为啥spring boot应用程序的main方法已经返回,但应用程序仍然可以接受请求? [关闭]