为什么重载主要方法会导致语法错误?
问题描述:
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");
}
}
我被检查,如果这两种主要的方法有哪一个会得到执行标准签名,但是当我编译它,它显示错误。为什么这样?为什么重载主要方法会导致语法错误?
答
使用省略号(...
)只是语法加糖,它允许您传递多个以逗号分隔的参数,而不是显式声明数组。从该方法中,对于参数是数组的所有意图和目的。所以,你基本上定义两种方法具有相同签名(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
这是如何重复[在Java程序中是否存在两个主要方法?](http://*.com/questions/13399836/can-there-exist-two-main-methods-in-a -java-程序)。这个问题问该'主要(字符串参数... args)'由varargs'的''而主(字符串ARGS [])'由array'作为参数的'。两者都有不同的签名(如果我们不考虑编译时转换),那么为什么我们不能定义两者。而问题* Java程序中是否可以存在两种主要方法?*询问问题是否可以有多个入口点。两者都不同。 –