Java 为什么重载main方法会导致语法错误?

Java 为什么重载main方法会导致语法错误?,java,overloading,Java,Overloading,我正在检查两个主要方法是否都有标准签名,哪一个将被执行,但当我编译它时,它显示错误。为什么会这样 不能同时声明main(字符串[])和main(字符串…)。您的类不能有两个具有相同签名的主方法(字符串…)与(字符串[])的主方法相同。java中不允许使用它。使用省略号(…)只是一种语法糖化,允许您传递几个逗号分隔的参数,而不是显式声明数组。从方法内部,出于所有意图和目的,该参数是一个数组。因此,您本质上定义了两个具有相同签名的方法(publicstaticvoidmain(String[])),

我正在检查两个主要方法是否都有标准签名,哪一个将被执行,但当我编译它时,它显示错误。为什么会这样

不能同时声明main(字符串[])和main(字符串…)。您的类不能有两个具有相同签名的主方法(字符串…)与(字符串[])的主方法相同。java中不允许使用它。

使用省略号(
)只是一种语法糖化,允许您传递几个逗号分隔的参数,而不是显式声明数组。从方法内部,出于所有意图和目的,该参数是一个数组。因此,您本质上定义了两个具有相同签名的方法(
publicstaticvoidmain(String[])
),这是不允许的,不管它是特殊的
main
方法。

Varargs基本上编译成单个数组。因此,有两种方法是相同的

您的代码(更改了其中一个主代码,现在是有效代码):

此代码使用bytcode查看器进行编译和反编译:

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");
  }
}
公共类重载{
公共重载(){//()V
L1{
aload0//对自我的引用
调用特定的java/lang/Object(()V);
返回
}
}
公共静态varargs main2(java.lang.String[]arg0){/([Ljava/lang/String;)V
L1{
getstatic java/lang/System.out:java.io.PrintStream
ldc“在main 1中”(java.lang.String)
invokevirtualjava/io/PrintStream println((Ljava/lang/String;)V);
}
L2{
返回
}
}
publicstaticmain(java.lang.String[]arg0){/([Ljava/lang/String;)V
L1{
getstatic java/lang/System.out:java.io.PrintStream
ldc“在main 2中”(java.lang.String)
invokevirtualjava/io/PrintStream println((Ljava/lang/String;)V);
}
L2{
返回
}
}
}
这个代码问:<代码>主(字符串…ARGs)< /COD>由<代码> VARARGS  >而主(String ARGS[])< /代码>由<代码>数组< /代码>作为参数。两个都有不同的签名(如果我们不考虑编译时转换),那么为什么我们不能同时定义这两种方法呢?而问题是Java程序中是否存在两种主要方法?问题是一个问题是否可以有多个入口点。两者都是不同的。从技术上讲,
main()
main2()
是完全不同的函数。所以它不排除重载这个术语在这里的适用性吗?另外,如果这是解决方案,那么我们是否应该得出主方法不能重载的结论?
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");
  }
}
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
         }
     }
}