2016-06-30 32 views
-1

重载的主要方法与字符串[] args和可变参数?如果不是那么为什么??我试着下面的代码给编译error.please帮助.i新的Java。重载的主要方法与字符串[]参数和可变参数?如果不是那么为什么?

public class obj1 { 

    public static void main(String ... args) { 
     System.out.println("main method varargs"); 
    } 

    public static void main(String[] args) { 
     System.out.println("main method string arrays"); 
    } 
} 
+4

变量参数('...')实际上只是数组参数的语法糖。因此,您试图使用相同的签名来定义两种方法。 –

+0

也在这里解释:http://stackoverflow.com/questions/301563/difference-fnstring-args-vs-fnstring-args – RichardK

+0

@AndyTurner你应该写这个答案,而不是一个评论:) – sotix

回答

5

在Java中,这两种方法实际上都是public static void main(String[] args)(基本上)。这就是为什么它不会编译;你不能有两个public static void main(String[])方法的类。

Java通过将函数编译为接受数组来添加可变参数,然后通过调用函数自动将可变参数包装到数组中。

也就是说,如果我们有一个名为与

foo("one", "two", "three"); 

什么编译器实际上是创建

void foo(String... args) 

void foo(String[] args) 

调用

foo(new String[] { "one", "two", "three"}) 

(编译标记在类文件中的方法,以便它后来知道,在端部阵列是可变参数,但它创建的代码是用于接受阵列的方法。)

这主要是由JLS§8.4.1覆盖:

方法或构造的最后形式参数是特殊的:它可以是一个可变元数参数,通过以下类型的省略号指示。

...

形式参数的声明类型取决于它是否是一个可变参数数量参数:

  • 如果正式参数不是一个可变参数数量的参数,则声明的类型如果没有括号对出现在UnannType和VariableDeclaratorId中,则由UnannType表示,否则由§10.2指定。

  • 如果形式参数是变量arity参数,则声明的类型由§10.2指定。 (请注意,“混合符号”不允许针对可变元数参数。)

...其中§10.2在谈论阵列。

事实上,使用数组而不是离散参数调用foo(String...)方法是完全有效的。例如,假设我们有:

private static void foo(String... args) { 
    for (String s : args) { 
     System.out.println(s); 
    } 
} 

我们可以调用,要么是这样的:

foo("one", "two", "three"); 

或类似这样的

foo(new String[] { "four", "five", "six"}); 

两者都是完全合法的;例如:http://ideone.com/a1Ku37

相关问题