通过main调用_为什么Java中的main方法必须是public static void的?

Java的main方法必须是public static void,因为public使得JVM能直接调用,static允许在类未实例化时执行,void表示main方法无需返回值。参数为String[]用于接收命令行参数。本文探讨了这些设计的原因。
摘要由CSDN通过智能技术生成

15adb83fcd222fc4974bd39089e96d92.png

点击菜单栏“粉丝福利”

拿小度,兑手机!

e02848f4e5c37c1e39ebf19818de789f.png

40b78ec65302a0587507933a78febc85.png

d3befd4e738e5e94c51107cb3376b5ae.png

fc7a3159d33d62b3f69d51870c971a2c.png

cad83d8bb9b8828343d66fc7cbe2f531.png

b8c053c49f0c3c528ec59931eeb42c17.png

96ea473b811a9adcfdc84f8f9f8719b3.png

在Java中,想必所有人都不会对main方法感到陌生,main方法是Java应用程序的入口方法。程序运行时,要执行的第一个方法就是main方法。

在使用Java写下第一个hello world的时候,我们需要创建一个main方法,当我们使用Spring Boot启动一个web应用的时候,我们也同样需要一个main方法。

当我们在Intellij IDEA中想要创建main 方法的时候,只需要输入psvm就会自动帮忙创建一个main方法:

ead39e98dab3b7cd551029c4de860b1f.gif

我们得到一个main方法后,不知道你有没有发现,任何时候,我们要创建的main方法的形式都是一样的:

public static void main(String[] args) {

}

首先都是public的、都是static的,返回值都是void,方法名都是main,入参都是一个字符串数组。

以上的方法声明中,唯一可以改变的的部分就是方法的参数名,你可以把args改成任意你想要使用的名字。

当然,main方法还可以写成以下形式,不过其实没啥区别:

public static void main(String... args) {

}

那么,不知道大家有没有想过,为什么main方法必须得是public static void类型的,他的参数又必须得是一个字符串数组呢?

1fdede431b93a14978386bbaae67a6a0.png

7e132711eb6518994bc5ece0766e2bf6.png

6a48a6456d439f3fdc4ddda57444fd7c.png

25792449c4b7cfa6d4b69c9416d37445.png

Java虚拟机如何启动

在《Java语言规范》中,对于Java虚拟机的启动给出了明确的定义:Java虚拟机是通过加载指定的类,然后调用该类中的main方法而启动的。

也就是说,通过调用某个指定类的main方法,传递给他单个的字符串数组参数,就可以启动Java虚拟机。

一个main方法想要被执行,需要经过几个步骤,首先对应的类需要被虚拟机加载,然后需要进行链接和初始化、之后才是调用main方法。

那么一个方法想要被调用,根据他的访问限定符以及方法类型不同,被调用的条件也是不同的。

077917308ed00f55106e4031a88adf7e.png

ea61b3db66cb5a053e9cccf35f16d1b1.png

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

Java中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。

default (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。

private : 在同一类内可见。使用对象:变量、方法。注意:不能修饰类(外部类)

public : 对所有类可见。使用对象:类、接口、变量、方法

protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。注意:不能修饰类(外部类)。

以上四种控制符都可以用来修饰方法,但是被修饰的方法的访问权限就不同了。

而对于main方法来说,我们需要通过JVM直接调用他,那么就需要他的限定符必须是public的,否则是无法访问的。

5e8387ae6484fd5b9d5c30b8a8be1d9b.png

d0abbea0e71756e982137bc9f5a05b0c.png

5f953f3e027e83548dc3fd142f459861.png

e054ed8332bfd35334bdfda35c738d72.png

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

static是静态修饰符,被他修饰的方法我们称之为静态方法,静态方法有一个特点,那就是静态方法独立于该类的任何对象,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。

而对于main方法来说,他的调用过程是经历了类加载、链接和初始化的。但是并没有被实例化过,这时候如果想要调用一个类中的方法。那么这个方法必须是静态方法,否则是无法调用的。

3c18537ea7d95d2e907aaf24396015e3.png

32e7785d633c73a4f925803238b784da.png

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

如果大家对于C语言和C++语言有一定的了解的话,就会知道,像 C、C++ 这种以 int 为 main 函数返回值的编程语言。

这个返回值在是程序退出时的 exit code,一般被命令解释器或其他外部程序调用已确定流程是否完成。一本正常情况下用 0 返回,非 0 为异常退出。

而在Java中,这个退出过程是由JVM进行控制的,在发生以下两种情况时,程序会终止其所有行为并退出:

1、所有不是后台守护线程的线程全部终止。

2、某个线程调用了Runtime类或者System类的exit方法,并且安全管理器并不禁止exit操作。

上面的两种情况中,第二种情况一旦发生,JVM是不会管main方法有没有执行完的,他都会终止所有行为并退出,这时候main方法的返回值是没有任何意义的。

所以,main方法的返回值就被固定要求为void。

509a2cc96ff354d01e6fc252eb9375b8.png

fda543a0267391d516fbf1af75b7334a.png

e54ad5b8ebac07b7532a787af11d8201.png

339cfbb19b43ec298ac95e5034a0e7b6.png

507eeda6c6375faaa785e117b3c7cba1.png

为什么 main 方法的入参是字符串数组(String[])

Java应用程序是可以通过命令行接受参数传入的,从命令行传递的参数可以在java程序中接收,并且可以用作输入。

因为命令行参数最终都是以字符串的形式传递的,并且有的时候命令行参数不止一个,所以就可能传递多个参数。

这时候,作为Java应用程序执行的入口,main方法就需要能够接受这多个字符串参数,那么就使用字符串数组了。

总结

main方法是JVM执行的入口,为了方便JVM调用,所以需要将他的访问权限设置为public,并且静态方法可以方便JVM直接调用,无需实例化对象。

因为JVM的退出其实是不完全依赖main方法的,所以JVM并不会接收main方法的返回值,所以给main方法定义一个返回值没有任何意义。所以main方法的返回值为void。

为了方便main函数可以接受多个字符串参数作为入参,所以他的形参类型被定义为String[]。

5188ed81804e26ef1f4f767b2ddec2ed.png

61a20ebecb7beb2ee163845b10268d64.png

87a681cfb3318d3842a5686db23537d7.png

4387077b55f0fb8209599edaeb880d00.png

作者:漫话编程  公众号:mhcoding 关于作者:漫话编程,是一个通过漫画+音频的形式讲解枯燥的编程知识的公众号。致力于让编程变得更有乐趣。

0e149cc296a239bdecd431e4a1bb9425.png

2ffafd1b6163bd0a7028bdbbc8feb3f3.png

b78d262b1c114ea5fa6522cfe6066379.png 785b54f3c23f7b0ad4912677f076cb88.png 178cdccffbade707a70b716f6d28e782.png 9c504470bf9e007bb6b3e71fd17a9943.png 9a5a5677a34d97a410af4608827be9f1.png 475b95c08c0b64b53fa0035294772d3f.png 57e2574b0745fcc399bb55ce34536ce3.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值