为什么重载main方法会产生语法错误?

时间:2016-08-15 06:02:18

标签: java overloading

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");
    }
}

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

3 个答案:

答案 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中不允许这样做。