我们可以使用这3个点在方括号的位置创建一个数组,就像我们在上面使用它一样吗? 如果不是那么为什么我们只将这个声明用于主要的?
public static void main(String[] args)
or
public static void main(String... args)
答案 0 :(得分:4)
这些不是两个不同的签名 - 在引擎盖下,它是相同的签名;区别在于编译器使用三个点来允许使用可变参数列表进行调用。
因为你永远不会直接调用main
(好吧,你不应该,不管怎样),差异对你来说无关紧要。签名的第一种形式是你在Java的基础书中看到的第一种形式,因此应该坚持使用方括号来获得代码读者的“即时熟悉度”。
答案 1 :(得分:1)
我知道这已经回答了,但是如果这可以帮助你理解更多......
针对您的具体问题 -
我们可以使用这3个点在正方形的位置创建一个数组 括号
直接答案是是,这是java文档: http://java.sun.com/docs/books/tutorial/java/javaOO/arguments.html#varargs
(String... args)
这里主线程调用传递一些参数的main方法。参数声明的类型是Array,但是当调用方法时,您可以传递一个或多个String对象或String对象数组作为该函数的参数。在这种情况下,main()没有专长。
此外,您可以通过以下任何方式调用myMethod(String .. args):
myMethod(); // Likely useless, but possible
myMethod("one", "two", "three");
myMethod("one");
myMethod(new String[]{"a", "b", "c"});
重要提示1:以这种方式传递的参数始终是一个数组 - 即使只有一个。确保在方法体中以这种方式对待它。
重要说明2 :获取...的参数必须是方法签名中的最后一个。所以,myMethod(int i,String ... strings)没问题,但myMethod(String ... strings,int i)不行。
您还提到过您尝试使用' Integer []'它没有用, 这是一个例子
public static void main(String[] args) {
Integer[] a = new Integer[4];
a[0] = 10;
a[1] = 20;
a[2] = 30;
a[3] = 40;
myMethod(a);
}
public static void myMethod(Integer... args) {
for (Integer i : args) {
System.out.println(i);
}
}
答案 2 :(得分:0)
是的,你在这里重载main方法,并且两者都被允许调用执行,因为Paramater类型的main方法是Array
String
...
方法main必须声明为public,static和void。它必须 指定声明类型为数组的形式参数(§8.4.1) 串。因此,可以接受以下任一声明:
public static void main(String[] args)
public static void main(String... args)
答案 3 :(得分:0)
看看这种方式。如果java使用反射来查找main方法,它会执行类似这样的操作(第6行)
public class Main {
public static void main(String[] args) throws Exception {
if (!(args.length == 1 && args[0].equals("Hello World"))) {
System.out.println("You did not recurse!");
Main.class.getDeclaredMethod("main", String[].class).invoke(null, (Object) new String[]{"Hello World"});
} else {
System.out.println("You recursed!");
}
}
}
它会找到一个用...
或[]
声明的函数,然后调用该函数。