前言

下午在这坐班,跟一老哥聊天,给我笑死了,在这聊技术,我问他什么是java他说是编程语言,我说有啥区别呢,他就不知道了,不过还能编一编,我随后又问为什么java写代码的时候为什么必须用 public static void,他就懵逼了,哈哈哈,其实所有Java程序员都写过:

public static void main(String[] args)

但是90%的人只会死记硬背,根本不知道为什么这一串单词几乎不能改动。

正文

一、为什么必须是 public?

核心原因:JVM对于我们自己写的Java代码来说,属于外部程序,不在项目的包、类体系内。
Java有四种访问权限,权限范围从小到大依次是:

  • private(仅本类可见)
  • default(同包可见)
  • protected(同包+子类可见)
  • public(全局所有位置可见)

如果main方法不设置为public,外部的JVM就没有访问权限,找不到程序的入口方法,直接报错无法启动程序。简单来说,

public就是专门给JVM开启的访问权限,是程序启动的必备钥匙。

二、为什么必须是 static?

这是最核心的关键点:程序刚刚启动的瞬间,我们编写的类仅仅完成了加载,没有创建任何实例对象。普通的实例方法,必须通过new创建对象之后才能调用。但main是程序的入口,是最先执行的方法,根本没有前置代码帮我们创建对象。而static静态方法的特性就是:依托类本身存在,不需要实例对象,类加载完成后就可以直接通过类名调用。

只有加上static,JVM才能在无对象的初始状态下,成功调用main方法启动程序。

三、为什么返回值必须是 void?

对比C/C++就能轻松理解,C语言的main方法有int返回值,主要是给操作系统传递程序退出状态,标识程序正常结束还是异常崩溃。但Java的程序退出机制,完全由JVM全权管控,和main方法的返回值没有任何关系。JVM退出只看两个条件:一是所有非守护线程全部执行完毕,二是代码调用了exit退出方法。

这就导致main方法的返回值没有任何接收方、没有任何实际作用,无论返回什么都不会影响程序运行和退出状态,所以Java直接规定main方法统一使用void无返回值。

四、为什么方法名必须固定为 main?

这是JVM的硬性固定规则,属于语法约定。JVM启动程序时,只会主动检索名为main的方法作为唯一入口。修改成Main、MAIN、main1等任何名称,都会导致JVM找不到程序入口,程序无法启动。

五、为什么入参必须是 String[] 字符串数组?

Java程序支持终端命令行传参启动,我们在命令行执行java命令运行程序时,后面可以携带多个自定义参数。
所有命令行传递的参数,本质都是字符串格式,且参数个数不固定,可能是0个、1个甚至多个。为了兼容不定数量的字符串参数,main方法的入参统一设置为String[]字符串数组,用来批量接收所有命令行参数。

总结如下

1、public:对外开放访问权限,让外部JVM可以识别、调用程序入口;
2、static:无需实例化对象,类加载后JVM可直接调用,适配程序启动初始状态;
3、void:Java程序退出由JVM线程状态决定,main方法返回值无实际意义;
4、main:JVM约定的唯一程序入口方法名,不可修改;
5、String[]:用于接收命令行传递的不定数量的字符串参数。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐