为什么没有主函数重载的冲突?

时间:2013-01-07 21:25:03

标签: java main variadic-functions

  

可能重复:
  Can we overload the main method in Java?

当我尝试编译并运行以下代码时,它正在工作,我在控制台上看到“A”。

为什么呢?

在我看来(String ... args)它是相同的(String arg,String [] args)

public class AFewMainExample {
    public static void main(String... args) {
        System.out.print("A");
    }

    public static void main(String args) {
        System.out.print("B");
    }

    public static void main(String[] args, String arg) {
        System.out.print("C");
    }

    public static void main(String arg, String[] args) {
        System.out.print("D");
    }
}

4 个答案:

答案 0 :(得分:2)

这实际上是在JLS中指定的,§12.1.4

  

方法main必须声明为publicstaticvoid。它必须指定一个形式参数(§8.4.1),其声明类型为String数组。因此,可以接受以下任一声明:

     
      
  • <强> public static void main(String[] args)

  •   
  • <强> public static void main(String... args)

  •   

除了调用函数的方式之外,varargs类型和标准数组类型之间没有区别,如here所述。因此,varargs版本满足上面详述的所有标准,并作为有效的main方法传递。显然,所有其他main重载都不相等(否则会出现编译错误)。

答案 1 :(得分:1)

第一个签名是唯一一个匹配void main(String [] args)

的签名

difference fn(String... args) vs fn(String[] args)

答案 2 :(得分:0)

每个main方法的参数(order(或)type(或))都是不同的,它们只留下一个带有真正主语法的main方法,所以没有问题。

如果添加以下main方法,您将看到编译时错误,因为现在有两种方法具有完全语法。

public static void main(String[] args) {
    System.out.print("A");
}

阅读本教程以获取有关overloading的更多信息。

答案 3 :(得分:0)

主要问题是:

+ signature of main(String... args) is different for
    - main(String[] args, String arg)
    - main(String arg, String[] args)

+ main(String... args) 
    - not equals for main(String[] args, String[] args2)
    - only for main(String[] args)

虽然我在以下示例中捕获了编译错误:

public class MainOverloadingExample4 {

void go(String s){
    System.out.println("void go(String s)");
}
void go(String ... s){
    System.out.println("void go(String ... s)");
}   
void go(String s, String ... arr){
    System.out.println("void go(String s, String ... arr){");
}   
public static void main(String[] args) {
    new MainOverloadingExample4().go("where I am?", "why I am here?");
}
}
  

方法go(String [])对于MainOverloadingExample类型

是不明确的