public static void main (String[] args) 为程序的入口方法,JVM 在运行程序时,会先查找 main() 方法。其中,
- public 是权限修饰符,表明任何类或对象都可以访问这个方法;
- static 表明 main() 方法是一个静态方法,即方法中的代码是存储在静态存储区的,只要类被加载后,就可以使用该方法而不需要通过实例化对象来访问,可以直接通过类名.main() 直接访问,JVM 在启动时就是按照上述方法的签名(必须有 public 与 static 修饰,返回值为 void,且方法的参数为字符串数组)来查找方法的入口地址,若能找到,就执行;找不到,则会报错。
- void 表明方法没有返回值;
- main 是 JVM 识别的特殊方法名,是程序的入口方法;
- 字符串数组参数 args 为开发人员在命令行状态下与程序交互提供了一种手段。
引申:
- main() 方法是否还有其他可用的定义格式?
- 由于 public 与 static 没有先后顺序关系,因此下面的定义也是合理的。 static public void main(String[] args)
- 也可以把 main() 方法定义为 final。 public static final void main (String[] args)
- 也可以用 synchronized 来修饰 main() 方法。 public static synchronized void main (String[] args)
不管用哪种定义方式,都必须保证 main() 方法的返回值为 void,并有 static 和 public 关键字修饰。同时由于 main() 方法为程序的入口方法,因此不能用 abstract 关键字来修饰。
Tips:对于 abstract 方法只允许声明,不允许实现(因为没有方法体)(毕竟叫抽象,当然不能实实在在的让你实现),并且不允许使用final 和 abstract 同时修饰一个方法或者类,也不允许使用 static 修饰 abstract 方法。也就是说,abstract 方法只能是实例方法,不能是类方法。
- 同一个 .java 文件中是否可以有多个 main() 方法? 虽然每个类中都可以定义 main() 方法,但是只有与文件名相同的用 public 修饰的类中的 main() 方法才能作为整个程序的入口方法。 例如,创建了一个名为 Test.java 的文件。
class T {
public static void main (String[] args) {
System.out.println("T main");
}
}
// 必须是用 public 修饰,且类名与文件名相同的类中的 main() 方法才是入口。
public class Test {
public static void main (String[] args) {
System.out.println("Test main");
}
}
程序运行结果为: Test main