main
Java 编程语言不保留该名称。它是一个普通标识符,因此适用与所有其他标识符相同的规则。您可以命名多个方法main
,只要它们具有不同的参数类型即可。这称为方法重载。
某个main
方法的特殊含义是由初始化你的应用程序的启动器定义的,这个启动过程定义了规则。请注意,启动应用程序可能有不同的、特定于实现的方式,例如,Applet
s 没有main
方法,而 JavaFX 提供了自己的启动器,无需main
方法即可工作。这同样适用于几种服务器端 Java 技术。这并不妨碍您main
在使用此类技术时声明方法,但它们没有特殊含义。
因此,著名的启动器使用命令行参数在指定的主类中java
搜索名为main
具有原始签名的特殊方法。public static void main(java.lang.String[])
请注意,早期的 Java 版本的启动器并不关心public
修饰符的存在与否。对启动器而言,重要的是它是否找到了这样的main
方法。它不关心其他同名不同签名的方法。它也不关心其他类是否有适当的main
方法。它所做的只是在指定的类中搜索合适的方法。
由于只有方法的原始(字节码级别)签名很重要,它具有哪种源代码形式无关紧要,只要它被编译为具有适当签名的方法即可。因此,以下声明将导致main
适用于启动 Java 应用程序的方法:
public static void main(String[] arg) {}
public static void main(String arg[]) {} // source code variantion don’t matter
public static void main(String... arg) {} // varargs are compiled to an array type
public static final void main(String[] arg) {} // final is irrelevant
public interface Example {
static void main(String[] arg) {} // public is implied (Java 8)
}
public static <T extends String> void main(T[] arg) {} // raw parameter type is String[]
请注意,对于最后一个变体,某些 IDE 无法启动应用程序(尽管它可以从命令行运行),这表明实际行为取决于启动器的实现。
相反,以下方法不起作用:
class String{}
public static void main(String[] arg) // the parameter type is not java.lang.String[]
证明,不是源代码形式而是编译的原始签名很重要。当尝试运行最后一个示例时,启动器会抱怨它没有找到所需的方法public static void main(String[])
,而不是告诉你有一个不同的、不匹配的main
方法。如前所述,它不关心该名称的其他方法。