主要方法有2种不同的签名

时间:2014-04-11 17:32:48

标签: java arrays main

我们可以使用这3个点在方括号的位置创建一个数组,就像我们在上面使用它一样吗? 如果不是那么为什么我们只将这个声明用于主要的?

public static void main(String[] args)

or

public static void main(String... args)

4 个答案:

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

JLS 12.1.4

中提及
  

方法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!");
        }
    }
}

它会找到一个用...[]声明的函数,然后调用该函数。