为什么重载主要方法会导致语法错误?

问题描述:

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

我被检查,如果这两种主要的方法有哪一个会得到执行标准签名,但是当我编译它,它显示错误。为什么这样?为什么重载主要方法会导致语法错误?

+2

这是如何重复[在Java程序中是否存在两个主要方法?](http://*.com/questions/13399836/can-there-exist-two-main-methods-in-a -java-程序)。这个问题问该'主要(字符串参数... args)'由varargs'的''而主(字符串ARGS [])'由array'作为参数的'。两者都有不同的签名(如果我们不考虑编译时转换),那么为什么我们不能定义两者。而问题* Java程序中是否可以存在两种主要方法?*询问问题是否可以有多个入口点。两者都不同。 –

使用省略号(...)只是语法加糖,它允许您传递多个以逗号分隔的参数,而不是显式声明数组。从该方法中,对于参数是数组的所有意图和目的。所以,你基本上定义两种方法具有相同签名(public static void main(String[])),这是不允许的,不管事实,即它的特殊main方法。

不能声明两个主(字符串[])和主(字符串...)。你的类不能有两个主要的方法具有相同的签名(String ...)和(String [])相同。它不允许在Java中。

可变参数基本上编译成单个阵列。因此,你有2种方法哪都一样

你的代码(改变的主要原因之一,它现在是一个有效的代码):

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 
     } 
    } 
} 
+0

好了,从技术上说,'的main()'和'MAIN2()'**是完全不同的功能**。那么它是否消除了在这里适用的术语**超载**?另外,如果这是解决方案,那么我们是否应该得出结论:主方法不能被重载? – progyammer