import java.util.*;
public class Overload {
public static void main(String...args) {
System.out.println("in main 1");
}
public static void main(String args[]) {
System.out.println("in main 2");
}
}
我正在检查两个主要方法是否都有标准签名,哪个会被执行但是当我编译它时,它会显示错误。为什么会这样?
答案 0 :(得分:2)
使用省略号(...
)只是语法糖,它允许您传递几个以逗号分隔的参数,而不是显式声明一个数组。从方法中,对于所有意图和目的,该参数是一个数组。所以,你实际上定义了两个具有相同签名(public static void main(String[])
)的方法,这是不允许的,不管它是特殊的main
方法。
答案 1 :(得分:2)
Varargs基本上编译成单个数组。因此,您有两种相同的方法
您的代码(更改了主要代码之一,它现在是有效代码):
import java.io.PrintStream;
public class Overload {
public static void main2(String... paramVarArgs) {
System.out.println("in main 1");
}
public static void main(String[] paramArrayOfString) {
System.out.println("in main 2");
}
}
此代码使用bytcode查看器进行编译和反编译:
public class Overload {
public Overload() { // <init> //()V
L1 {
aload0 // reference to self
invokespecial java/lang/Object <init>(()V);
return
}
}
public static varargs main2(java.lang.String[] arg0) { //([Ljava/lang/String;)V
L1 {
getstatic java/lang/System.out:java.io.PrintStream
ldc "in main 1" (java.lang.String)
invokevirtual java/io/PrintStream println((Ljava/lang/String;)V);
}
L2 {
return
}
}
public static main(java.lang.String[] arg0) { //([Ljava/lang/String;)V
L1 {
getstatic java/lang/System.out:java.io.PrintStream
ldc "in main 2" (java.lang.String)
invokevirtual java/io/PrintStream println((Ljava/lang/String;)V);
}
L2 {
return
}
}
}
答案 2 :(得分:0)
你不能同时声明main(String [])和main(String ...)。您的类不能有2个具有相同signatue(String ...)的主要方法与(String [])相同。在java中不允许这样做。