java中main方法前的public static void及其后面的(String[] args)【笔记自用】

本文详细探讨了Java中main方法为何必须是public static void。void表示无返回值,因为JVM不接收返回值;public确保main方法在任何地方都能被调用,尤其对于JVM来说;static使得main方法无需对象即可调用,适合作为程序入口。此外,文章还提及了main方法参数String[] args的用途,允许在运行时传递命令行参数。

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

为什么Java的main方法必须是public static void?

一、 void

如下,像C, C++一样,将返回值类型改为int,再返回一个0,虽然编译通过,但是运行时会报错。
  在这里插入图片描述
找到一种可理解的解释:方法的副作用和返回值类型。(http://www.cnblogs.com/huanmin/p/6429778.html)

一个方法的执行,如果在返回一个值之外还导致某些外部“状态”发生变化,则称该方法产生了副作用。这里所谓“状态”发生变化,可以是实例域或静态变量被修改。

没有返回值的方法必有副作用,除非它的方法体是空的或者方法没有意义。所以,没有返回值的方法、有返回值但有副作用的方法称为过程;
有返回值而且没有副作用的方法称为函数(function)。
  由于Java的主函数是栈中最底层的函数,所以并不存在能够接收的值(没有谁能接收main的返回值),所以使用void。

可是为什么Java不能像C, C++那样返回int型值?

找到描述C语言的main函数的调用过程:首先,我们的程序进入到入口函数之前,是发生了很多事情的。操作系统的安排,启动运行时库,运行时库再初始化好环境,然后启动你的入口函数,你的程序才正常的运行起来。等你的程序运行结束后,就退回到运行时库,然后再退回到操作系统,然后系统再调度其他程序执行。(https://www.cnblogs.com/deanyuton/p/8227733.html)

因为main()不是由操作系统直接调用,所以返回类型不一样也是可以理解的。可以认为运行时库就是操作系统和main函数的中间联系人,在C语言中由运行时库直接调用main函数,所以main函数的返回值也是运行时库接收。在Java中,可以认为是操作系统→JVM→main函数这样的调用过程,JVM直接调用main函数,所以如果main函数有返回值,即JVM接收。但是JVM被设计为不接受任何返回值,所以main函数不能有返回值,只能void。
  但是JVM为什么不接受返回值?

https://www.cnblogs.com/mengfanrong/p/5225506.html(装载JVM)

https://www.cnblogs.com/iceAeterNa/p/4876940.html (深入虚拟机)

二、 public

1、去掉public关键字
  在这里插入图片描述
  2、public关键字改为protected
  在这里插入图片描述
 3、public改为private
 在这里插入图片描述
 public是函数的权限,决定了是否可以被外部函数调用,如果改为private,则只能是该main函数所在类的方法可以调用,在其他类中不可见,protected规定子类和同一个包类可用,但是调用main函数的函数所在包和main函数所在包肯定不在同一个包内,所以必须是public。C里面的函数是运行在操作系统环境中的,注意是运行时库调用main函数,但是整个C代码及运行时库都直接在操作系统中运行,但是Java的代码是运行在JVM中的,如果不限定public,JVM就无法调用main函数。(https://blog.csdn.net/echostream/article/details/44039169)

但是在Java SE1.4以前是不强制main函数为public的。当main方法不是public时,有些版本的java解释器也可以执行java应用程序。有个程序员报告了这个bug. 如果感兴趣可以查一下这个bug号码4252539.这个bug被标明“关闭”,不予修复。Sun公司的工程师解释说:java虚拟规范并没有要求main方法一定是public。 好在,这个问题在 java SE1.4及以后的版本中强制main方法是public 最终的到了解决。(https://www.cnblogs.com/liutaoblogs/p/6542628.html)

三、 static

在这里插入图片描述
在C语言中,所有的函数都可以被直接调用,main函数相当于全局函数,但在Java中一般先要创建一个类的对象,再通过对象调用函数,但是在执行main函数之前创建一个对象显然是不可能的,因为JVM规定main函数为入口函数,从main开始执行。static关键字就解决了这个问题,static关键字修饰的方法可以视为类方法,不需要创建对象就可以直接调用该方法。

四、 main方法重载

main函数也可以重载,只要满足重载的条件即可。
在这里插入图片描述

Java中main方法参数String[ ] args的使用。

我们刚开始学习java时都会被要求记住主方法(main)的写法,就像这样:

1 public static void main(String[] args){ }   
2 public static void main(String args[]){ }   //两种写法都是一样的,都表示字符串数组args,其中args只是普通变量名,可以随意定义(前提是符合变量名规则)

为什么一定要这么写?是java规定的(具体的意义我不知道),main方法参数必须为字符串数组(String [ ]),变量名可以随意,通常使用args即是arguments(”参数“的复数形式)的缩写。
如果我们就是不呢?那就不能被系统识别为主方法,例如这样:

1  public static void main(String args){ //将String[]改成了String
2         //省略几百万代码    
3 }

在Eclipse运行结果:
在这里插入图片描述
如果在已经有正确main方法,再有同名的main方法就是方法重载了:

1 public static void main(String[] args){
2     //正确标准完美的main方法
3 }
4 
5 public static void main(String args){
6     //方法重载
7 }

回归正题:

== 参数String[ ] args的作用就是可以在main方法运行前将参数传入main方法中。==

1)从控制台,输入编译执行命令时传参数。例如下面代码:

1 public static void main(String[] args){
2     for(int i=0; i<args.length; i++)
3         System.out.println(args[i]);        //遍历输出args[]中元素    
4 }

但是此时args[]并没有赋值,我们需要从控制台命令行进行赋值,就像这样:
在这里插入图片描述
所以在命令行中使用String[ ] args即传入参数的使用为:java 类名 【参数1】 【参数2】 【参数3】 .。。。

2)在Eclipse使用String[ ] args。

    鼠标右键点击程序

在这里插入图片描述
出现以下窗口,切换到(x)=Arguments窗口,输入参数
在这里插入图片描述
最后点击Run运行即可。

### Java 中 `public static void main` 方法的作用及参数说明 #### 作用 在 Java 编程语言中,`public static void main(String[] args)` 是每一个独立运行的应用程序的入口点。当启动一个 Java 应用程序时,Java 虚拟机 (JVM) 将寻找并调用此方法作为程序执行的第一步[^1]。该方法具有特定的签名和修饰符组合,这是 JVM 所必需的标准形式。 - **`public`**: 这一关键字表示该方法可以被外部访问。由于它是程序的起点,因此必须对外公开以便 JVM 可以找到并调用它[^3]。 - **`static`**: 表明这是一个静态方法,意味着它可以无需创建类的实例而直接通过类名调用。这使得 JVM 不必先初始化对象即可执行代码[^5]。 - **`void`**: 返回类型为 `void` 的方法不会返回任何值。对于主方法而言,其职责仅在于控制流程而非提供计算结果给其他部分,所以采用无返回的设计[^4]。 - **`String[] args` 参数列表**:允许传递命令行输入到应用程序中。这些字符串代表来自终端或其他环境下的用户数据或配置选项等信息[^2]。 以下是标准的 `main` 方法定义及其基本结构: ```java public class MainClass { public static void main(String[] args) { System.out.println("Hello, world!"); } } ``` 上述例子展示了如何利用 `main` 函数打印简单的问候语句至控制台窗口上。 #### 关键字解释与必要性分析 如果尝试改变其中任何一个关键词,则可能导致编译错误或者无法正常加载应用的情况发生。下面逐一探讨各个组成部分的重要性以及移除它们可能带来的后果: - 如果缺少 `public`, 则因为权限不足,JVM找不到可执行的方法. - 去掉 `static` 后需要实例化类才可以调用非静态版本的同名函数;然而此时还没有机会建立此类实体之就已经停止工作了. - 更改成有返回值得话违反惯例而且不符合实际需求场景. 综上所述 ,只有保持原始形态才能满足预期功能要求 .
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值