网站首页 > java教程 正文
在Java中,想必所有人都不会对main方法感到陌生,main方法是Java应用程序的入口方法。程序运行时,要执行的第一个方法就是main方法。
在使用Java写下第一个hello world的时候,我们需要创建一个main方法,当我们使用Spring Boot启动一个web应用的时候,我们也同样需要一个main方法。
当我们在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虚拟机的启动给出了明确的定义:Java虚拟机是通过加载指定的类,然后调用该类中的main方法而启动的。
也就是说,通过调用某个指定类的main方法,传递给他单个的字符串数组参数,就可以启动Java虚拟机。
一个main方法想要被执行,需要经过几个步骤,首先对应的类需要被虚拟机加载,然后需要进行链接和初始化、之后才是调用main方法。
那么一个方法想要被调用,根据他的访问限定符以及方法类型不同,被调用的条件也是不同的。
为什么 main 方法是公有的(public)?
Java中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。
default (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
private : 在同一类内可见。使用对象:变量、方法。注意:不能修饰类(外部类)
public : 对所有类可见。使用对象:类、接口、变量、方法
protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。注意:不能修饰类(外部类)。
以上四种控制符都可以用来修饰方法,但是被修饰的方法的访问权限就不同了。
而对于main方法来说,我们需要通过JVM直接调用他,那么就需要他的限定符必须是public的,否则是无法访问的。
为什么 main 方法是静态的(static)?
static是静态修饰符,被他修饰的方法我们称之为静态方法,静态方法有一个特点,那就是静态方法独立于该类的任何对象,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。
而对于main方法来说,他的调用过程是经历了类加载、链接和初始化的。但是并没有被实例化过,这时候如果想要调用一个类中的方法。那么这个方法必须是静态方法,否则是无法调用的。
为什么 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。
为什么 main 方法的入参是字符串数组(String[])
Java应用程序是可以通过命令行接受参数传入的,从命令行传递的参数可以在java程序中接收,并且可以用作输入。
因为命令行参数最终都是以字符串的形式传递的,并且有的时候命令行参数不止一个,所以就可能传递多个参数。
这时候,作为Java应用程序执行的入口,main方法就需要能够接受这多个字符串参数,那么就使用字符串数组了。
总结
main方法是JVM执行的入口,为了方便JVM调用,所以需要将他的访问权限设置为public,并且静态方法可以方便JVM直接调用,无需实例化对象。
因为JVM的退出其实是不完全依赖main方法的,所以JVM并不会接收main方法的返回值,所以给main方法定义一个返回值没有任何意义。所以main方法的返回值为void。
为了方便main函数可以接受多个字符串参数作为入参,所以他的形参类型被定义为String[]。
来源:漫画编程
好了,今天的文章分享到这就结束了,要是喜欢的朋友,请点个关注哦!--我是简搭(jabdp),我为自己“带盐”,感谢大家关注。
猜你喜欢
- 2024-12-30 阿里一面:如何用基于Java配置的方式配置Spring?
- 2024-12-30 Java小白学习方法以及Java学习路线,最终完成分布式项目开发
- 2024-12-30 【Java基础】Java中方法的定义和调用
- 2024-12-30 Java方法定义和调用 java中定义方法和调用方法
- 2024-12-30 探秘Java接口中的默认方法 探秘java接口中的默认方法有哪些
- 2024-12-30 Java方法全解析:让你的代码高效优雅,快速学会方法的定义和调用
- 2024-12-30 Java教程:常见的数据通信方式有哪些?
- 2024-12-30 探索 Java 中的类和主方法 java的类方法和实例方法
- 2024-12-30 Java方法两千行!有更长的吗? java方法一般不超过多少行
- 2024-12-30 一种简单快捷的 java 热部署方式 jar热部署
你 发表评论:
欢迎- 04-24Java Collections 工具类集合框架中常用算法解析
- 04-24桶排序的简单理解
- 04-24Java集合框架底层实现原理大揭秘
- 04-24Java 集合框架全面解析:选对数据结构,提升开发效率
- 04-24c#集合排序
- 04-24Java面试中常被问到的集合类深度解读
- 04-24VBA技术资料MF278:对集合进行排序
- 04-24Spring 最常用的 7 大类注解,史上最强整理
- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)