为什么main方法是静态的

本文详细解释了Java中主方法(main方法)为何必须声明为public、static和void的原因。介绍了这些关键字的作用,以及如何正确地定义main方法以确保Java应用程序能够正常启动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public  static void main(String... args)

为什么main方法是静态的(static)

  1. 正因为main方法是静态的,JVM调用这个方法就不需要创建任何包含这个main方法的实例。
  2. 因为C和C++同样有类似的main方法作为程序执行的入口。
  3. 如果main方法不声明为静态的,JVM就必须创建main类的实例,因为构造器可以被重载,JVM就没法确定调用哪个main方法。
  4. 静态方法和静态数据加载到内存就可以直接调用而不需要像实例方法一样创建实例后才能调用,如果main方法是静态的,那么它就会被加载到JVM上下文中成为可执行的方法。

为什么main方法是公有的(public)

Java指定了一些可访问的修饰符如:private、protected、public,任何方法或变量都可以声明为public,Java可以从该类之外的地方访问。因为main方法是公共的,JVM就可以轻松的访问执行它。

为什么main方法没有返回值(Void) 

因为main返回任何值对程序都没任何意义,所以设计成void,意味着main不会有任何值返回

总结

    1. main方法必须声明为public、static、void,否则JVM没法运行程序
    2. 如果JVM找不到main方法就抛出NoSuchMethodError:main异常,例如:如果你运行命令:java HelloWrold,JVM就会在HelloWorld.class文件中搜索public static void main (String[] args) 放法
    3. main方式是程序的入口,程序执行的开始处。
    4. main方法被一个特定的线程”main”运行,程序会一直运行直到main线程结束或者non-daemon线程终止。
    5. 当你看到“Exception in Thread main”如:Excpetion in Thread main:Java.lang.NullPointedException ,意味着异常来自于main线程
    6. 你可以声明main方法使用java1.5的可变参数的方式如:
      public  static void main(String... args)
    7. 除了static、void、和public,你可以使用final,synchronized、和strictfp修饰符在main方法的签名中,如:
      public  strictfp final  synchronized static  void main(String[] args)
    8. main方法在Java可以像其他方法一样被重载,但是JVM只会调用上面这种签名规范的main方法。
    9. 你可以使用throws子句在方法签名中,可以抛出任何checked和unchecked异常
    10. 静态初始化块在JVM调用main方法前被执行,它们在类被JVM加载到内存的时候就被执行了。
### Java 静态变量与非静态 main 方法 #### 主要差异概述 静态变量属于类本身而非特定的对象实例,因此在整个应用程序生命周期内只存在一份副本。相反,`main` 方法作为程序入口点,默认是非静态成员函数的情况较少见,通常 `main` 是被定义为静态方法以便可以直接由 JVM 调用而无需创建任何对象。 #### 使用场景对比 对于 **静态变量** 来说,在多个对象间共享数据时非常有用[^1]。例如计数器记录已创建了多少个对象: ```java class Counter { private static int count = 0; public Counter() { ++count; } } ``` 而对于 **非静态main 方法**, 这种情况并不常见因为这会违反Java语言规范的要求——即启动类中的`public static void main(String[] args)`签名[^2]。如果尝试实现这样的设计,则需要先实例化该类才能调用其内部的方法,但这不是标准做法也不推荐这样做。 #### 实际应用例子 下面是一个展示如何正确使用静态变量以及为什么应该保持`main()`为静态的例子: ```java // 正确的方式 - 带有静态main方法的应用程序结构 public class Application { // 定义一个静态变量用于存储公司地址 private static final String COMPANY_ADDRESS = "北京市朝阳区"; /** * 应用程序入口. */ public static void main(String[] args) { System.out.println("欢迎来到我们的办公室:" + COMPANY_ADDRESS); Employee emp = new Employee(); emp.displayInfo(); } } class Employee { private String name; public Employee(){ this.name="默认员工"; } public void displayInfo(){ System.out.println("我是"+this.name+",工作地点位于:"+Application.COMPANY_ADDRESS); } } ``` 在这个例子中,`COMPANY_ADDRESS` 是一个静态字段,可以在不创建 `Application` 类的新实例的情况下访问它。同时,由于 `main` 方法也是静态的,所以JVM可以立即执行这段代码而不必担心初始化其他部分的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值