为什么main方法是public static void?

本文深入解析Java程序入口-main方法的设计原则,包括为何它是public、static、void,以及这些关键字的作用和意义。

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

Main方法是Java程序的入口,记住,我们这里不会讨论Servlet、MIDlet和其他任何容器管理的java程序,在java核心编程中,JVM会查找类中的public static void main(String[] args),如果找不到该方法就抛出错误NoSuchMethodError:main 程序终止。
Main方法必须严格遵循它的语法规则,方法签名必须是public static void,参数是字符串数组类型,如果是Java1.5及以后的版本还可以使用可变参数:

1
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的可变参数的方式如:
    1
    public static void main(String... args)
  7. 除了static、void、和public,你可以使用final,synchronized、和strictfp修饰符在main方法的签名中,如:
    1
    public strictfp final synchronized static void main(String[] args)
  8. main方法在Java可以像其他方法一样被重载,但是JVM只会调用上面这种签名规范的main方法。
  9. 你可以使用throws子句在方法签名中,可以抛出任何checked和unchecked异常
  10. 静态初始化块在JVM调用main方法前被执行,它们在类被JVM加载到内存的时候就被执行了。
原文链接:  javavisited  翻译:  ImportNew.com  刘志军
译文链接:  http://www.importnew.com/8475.html
<think>好的,我现在需要详细解释Java中的public static void main(String[] args)方法。首先,我得回忆一下这个方法的基本结构和各个关键字的作用。根据用户提供的引用资料,特别是引用[4],里面已经详细拆解了每个部分,所以我要确保准确引用这些信息。 首先,public是访问修饰符,表示这个方法可以被JVM公开访问。然后,static关键字说明这是一个静态方法,不需要实例化类就可以调用。接下来是void,表示方法没有返回值。main方法名,作为程序的入口点。参数String[] args是字符串数组,用于接收命令行参数。 我需要分点解释每个部分,比如public的作用、static的意义、void的必要性,以及args的具体用途。同时,要提到这个方法为什么必须这样声明,比如JVM的规范要求,否则程序无法启动。可能还需要举例子,比如如何传递命令行参数,并在代码中读取它们,这样用户能更直观地理解。 另外,要注意引用对应的资料,比如引用[4]详细解释了各个字段,所以每个部分解释后要加上对应的引用标记。还要确保使用正确的LaTeX格式,比如行内公式用$...$,独立公式用$$...$$,但在这个问题中可能数学公式不多,但如果有涉及的地方需要注意格式。 最后,生成相关问题时要围绕main方法的特性、参数使用、修饰符的作用等方面提问,确保问题相关有深度。比如可能的问题包括为什么main方法必须是静态的,或者如何处理命令行参数等。需要检查是否有重复或不够明确的问题,调整使其更清晰。</think>### Java中`public static void main(String[] args)`方法详解 `public static void main(String[] args)`是Java程序的入口方法,其定义需严格遵循语法规范,否则程序无法运行。以下逐部分解析其含义: #### 1. **`public`修饰符** - **作用**:声明方法的访问权限为公共,允许Java虚拟机(JVM)直接调用该方法[^4]。 - **权限级别**:`public`是最高权限修饰符,确保JVM无需通过类实例即可访问该方法[^4]。 #### 2. **`static`关键字** - **作用**:将方法标记为静态,使其不依赖类的实例化即可调用。 - **限制**:静态方法只能直接访问类的静态成员(量或方法),无法直接调用非静态成员。 #### 3. **`void`返回值类型** - **作用**:声明方法无返回值。 - **规范**:若方法需要返回值,需替换为具体类型(如`int`、`String`),但`main`方法必须为`void`以符合JVM调用约定[^4]。 #### 4. **方法名`main`** - **特殊性**:`main`是JVM识别的固定方法名,作为程序唯一入口。若名称错误,程序无法启动[^2]。 #### 5. **参数`String[] args`** - **作用**:接收命令行输入的参数,以字符串数组形式存储。 - **示例**: ```java public class Test { public static void main(String[] args) { for (String arg : args) { System.out.println("参数: " + arg); } } } ``` 执行`java Test hello world`时,`args`数组内容为`["hello", "world"]`。 #### 6. **方法体要求** - **规范**:方法体必须包含程序逻辑的起点。例如,初始化对象、调用其他方法等。 --- ### 常见问题解答 **Q1: 为什么`main`方法必须是静态的?** - **答**:JVM在加载类时未创建实例对象,因此需通过`static`直接调用`main`方法,无需实例化类。 **Q2: 如何传递命令行参数?** - **答**:在运行程序时通过命令行输入参数,如`java MyProgram arg1 arg2`,参数以空格分隔并存入`args`数组。 **Q3: 是否可以修改`args`的参数名称?** - **答**:可以,如`String[] params`,但通常保持`args`以增强代码可读性[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值