我不是在问什么是(String args[])
,因为这里的答案是:什么是"字符串args[]"?主方法Java中的参数。
我的问题是,为什么在写main()的时候必须写它?
我参加了实践考试,在那里我遇到了一个问题,并意识到我在写public static void main()
时没有写String args[]
。但在编写了main(String args[])
之后,问题得到了解决。(我仍然不知道如何以及为什么!)
同一天,我在Viva中被问到——"在写main()
的时候有必要写这个String args[]
吗?"由于出现了错误,我回答了"是",但当被问到"为什么?"时,我没有回答
所以我想知道为什么有必要写String[]args。
来自Java语言规范12.1.4
方法
main
必须声明为public
、static
和void
。它必须指定一个形式参数(§8.4.1),其声明的类型为String
的数组。因此,以下任何一种声明都是可以接受的:
public static void main(String[] args)
public static void main(String... args)
(请注意,在同一个类中不能有两个main
方法和String[]
和String...
,因为varargs只是语法糖,在编译时会被数组取代,所以最终会有两个方法处理String[]
,而一个类不能有两种名称和参数相同的方法)
所以当你执行这样的命令时
java YourClass foo bar
Java虚拟机将把foo
和bar
参数放在String[]
数组中,并尝试将该数组传递给main
方法,后者可以接受它作为参数。
当命令没有任何像这样的参数时,也会使用此方法
java YourType
这个决定简化了我们的生活,因为我们不需要专注于处理有两个入口点的情况
- 一个用于带参数的命令
- 命令并没有任何参数
我们可以简单地允许用户传递参数,但如果我们不想处理它们,我们可以忽略它们。
还要记住,我们可以在类中拥有任何具有正确声明的方法(并且不会违反从超类继承的任何规则,如扩大成员可见性-我们不能公开受保护的方法),因此拥有没有错
public static void main(){
/*your code*/
}
但您需要意识到,此方法不能用作入口点,因此,如果您想从此方法启动应用程序,则需要创建适当的main
方法,该方法将执行您的main()
方法:
public static void main(String ...){
main();
}
在Java中,入口点必须是public static void main(String[])
方法。这就是运行类时的简单名称。不会调用不带参数的main()
方法。如果您的命令中没有参数,那么您只是在调用长度为0的数组main(String[])
。
为了解决Viva问题,参数的标识符仅由编译器使用,并且可以更改,同时替换[]
的位置或使用String...
指定数组。因此,这似乎是一个技术问题,但你可以使用以下任何一种:
public static void main(String[] args)
public static void main(String args[])
public static void main(String... args)
public static void main(String[] custom_identifier)
public static void main(String custom_identifier[])
public static void main(String... custom_identifier)
它用于命令参数。如果没有它们,JVM将不得不在尝试调用该方法之前执行检查,以查看该方法是否包含参数,从而确定它是否可以执行main()
或main(args)
(两种语法正确的方法,具有不同的调用方式)