4

可能重复:
我们可以重载 Java 中的 main 方法吗?

当我尝试编译并运行以下代码时,它正在工作,我在控制台上看到“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

4 回答 4

2

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

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

  • public static void main(String[] args)

  • public static void main(String... args)

除了调用函数的方式之外,可变参数类型和标准数组类型之间没有区别,正如这里所指出的那样。因此,可变参数版本满足上面详述的所有标准并作为有效main方法通过。显然,所有其他main重载都不等效(否则会出现编译错误)。

于 2013-01-07T21:33:59.233 回答
1

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

差异 fn(String... args) 与 fn(String[] args)

于 2013-01-07T21:28:32.830 回答
0

每个主要方法的参数(顺序(或)类型(或)两者)都不同,这仅留下一个具有真正主要语法的主要方法,因此没有问题。

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

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

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

于 2013-01-07T21:27:20.747 回答
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 类型不明确

于 2013-01-07T22:25:56.023 回答