是否可以用字符串[] args和varargs重载主方法?如果没有那么为什么呢?

时间:2016-06-30 09:53:48

标签: java overloading

是否可以用字符串[] args和varargs重载主方法?如果没有那么为什么?我尝试了下面的代码,它给出了编译错误。请帮助。我是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");
    }
}

1 个答案:

答案 0 :(得分:5)

在Java中,这两种方法都是public static void main(String[] args)(从根本上说)。这就是为什么它不会编译;你不能拥有一个包含两个public static void main(String[])方法的课程。

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

也就是说,如果我们有

void foo(String... args)

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

编译器实际创建的是

void foo(String[] args)

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

(编译器在类文件中标记该方法,以便稍后知道末尾的数组是可变参数,但它创建的代码是接受数组的方法。)

这主要由JLS§8.4.1涵盖:

  

方法或构造函数的最后一个形式参数是特殊的:它可能是变量arity参数,由类型后面的省略号表示。

     

...

     

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

     
      
  • 如果形式参数不是变量arity参数,则如果UnannType和VariableDeclaratorId中没有括号对出现,则声明的类型由 UnannType 表示,否则由§10.2指定。 / p>

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

  •   

...其中§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