在Java中,想必全部人都不会对main方法感到陌生,main方法是Java应用程序的入口方法。程序运行时,要执行的第一个方法就是main方法。java
在使用Java写下第一个hello world的时候,咱们须要建立一个main方法,当咱们使用Spring Boot启动一个web应用的时候,咱们也一样须要一个main方法。web
当咱们在Intellij IDEA中想要建立main 方法的时候,只须要输入psvm就会自动帮忙建立一个main方法:编程
咱们获得一个main方法后,不知道你有没有发现,任什么时候候,咱们要建立的main方法的形式都是同样的:数组
public static void main(String[] args) {
}
首先都是public的、都是static的,返回值都是void,方法名都是main,入参都是一个字符串数组。安全
以上的方法声明中,惟一能够改变的的部分就是方法的参数名,你能够把args改为任意你想要使用的名字。微信
固然,main方法还能够写成如下形式,不过其实没啥区别:编程语言
public static void main(String... args) {
}
那么,不知道你们有没有想过,为何main方法必须得是public static void类型的,他的参数又必须得是一个字符串数组呢?编辑器
在《Java语言规范》中,对于Java虚拟机的启动给出了明确的定义:Java虚拟机是经过加载指定的类,而后调用该类中的main方法而启动的。函数
也就是说,经过调用某个指定类的main方法,传递给他单个的字符串数组参数,就能够启动Java虚拟机。flex
一个main方法想要被执行,须要通过几个步骤,首先对应的类须要被虚拟机加载,而后须要进行连接和初始化、以后才是调用main方法。
那么一个方法想要被调用,根据他的访问限定符以及方法类型不一样,被调用的条件也是不一样的。
Java中,可使用访问控制符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不一样的访问权限。
default (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
private : 在同一类内可见。使用对象:变量、方法。注意:不能修饰类(外部类)
public : 对全部类可见。使用对象:类、接口、变量、方法
protected : 对同一包内的类和全部子类可见。使用对象:变量、方法。注意:不能修饰类(外部类)。
以上四种控制符均可以用来修饰方法,可是被修饰的方法的访问权限就不一样了。
而对于main方法来讲,咱们须要经过JVM直接调用他,那么就须要他的限定符必须是public的,不然是没法访问的。
static是静态修饰符,被他修饰的方法咱们称之为静态方法,静态方法有一个特色,那就是静态方法独立于该类的任何对象,它不依赖类特定的实例,被类的全部实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。
而对于main方法来讲,他的调用过程是经历了类加载、连接和初始化的。可是并无被实例化过,这时候若是想要调用一个类中的方法。那么这个方法必须是静态方法,不然是没法调用的。
若是你们对于C语言和C++语言有必定的了解的话,就会知道,像 C、C++ 这种以 int 为 main 函数返回值的编程语言。
这个返回值在是程序退出时的 exit code,通常被命令解释器或其余外部程序调用已肯定流程是否完成。一本正常状况下用 0 返回,非 0 为异常退出。
而在Java中,这个退出过程是由JVM进行控制的,在发生如下两种状况时,程序会终止其全部行为并退出:
一、全部不是后台守护线程的线程所有终止。
二、某个线程调用了Runtime类或者System类的exit方法,而且安全管理器并不由止exit操做。
上面的两种状况中,第二种状况一旦发生,JVM是不会管main方法有没有执行完的,他都会终止全部行为并退出,这时候main方法的返回值是没有任何意义的。
因此,main方法的返回值就被固定要求为void。
Java应用程序是能够经过命令行接受参数传入的,从命令行传递的参数能够在java程序中接收,而且能够用做输入。
由于命令行参数最终都是以字符串的形式传递的,而且有的时候命令行参数不止一个,因此就可能传递多个参数。
这时候,做为Java应用程序执行的入口,main方法就须要可以接受这多个字符串参数,那么就使用字符串数组了。
main方法是JVM执行的入口,为了方便JVM调用,因此须要将他的访问权限设置为public,而且静态方法能够方便JVM直接调用,无需实例化对象。
由于JVM的退出实际上是不彻底依赖main方法的,因此JVM并不会接收main方法的返回值,因此给main方法定义一个返回值没有任何意义。因此main方法的返回值为void。
为了方便main函数能够接受多个字符串参数做为入参,因此他的形参类型被定义为String[]。
关于做者:漫话编程,是一个经过漫画+音频的形式讲解枯燥的编程知识的公众号。致力于让编程变得更有乐趣。
推荐阅读:
喜欢我能够给我设为星标哦



本文分享自微信公众号 - 漫话编程(mhcoding)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。