Java工程中的主函数public static void main(String[] args)


平时写java project的时候,肯定会看到public static void main(String[] args),一说起来,大家都管它叫“主函数”、“Java应用程序的入口”等等。但是它到底用在哪里,其中的String[] args到底都有什么,将在这篇博客中仔细介绍。

主函数简介

首先,public static void main(String[] args)是作为Java程序的程序入口,main是JVM识别的特殊方法名,只有包含main()方法的java程序才能够被JVM执行。JVM通过main方法找到需要启动的运行程序,并且检查main函数所在类是否被JVM装载。如果没有装载,那么就装载该类,并且装载该类的所有相关类。因此程序在运行的时候,第一个执行的方法(注意是方法,而不是其他的,例如代码块——为什么这么说,还有代码块在main方法前面调用?待补入本文)就是main()方法。简单点说,JVM运行程序的时候,首先找的就是main方法——你在哪个文件创建了public static void main(String[] args),JVM就从那个文件的public static void main(String[] args)开始执行。jvm在启动时就是按照上诉方法的签名(必须有public和static修饰,返回值为void,且方法参数为字符串数组,待验证)来查找方法的入口地址,若找到就执行,找不到就会报错。

在新建文件时,会有一项提示“是否新建public static void main(String[] args),选中它,就会在这个新建的文件内生成public static void main(String[] args),待补图

主函数声明中各关键词的作用

然后,我们分别来看下public static void main(String[] args)中各个关键字起到的作用:

public

main是java程序的入口,java程序通过JVM调用,属于外部调用,所以需要使用public修饰,否则虚拟机无法调用

static

在java中,没有static的变量或函数,如果想被调用的话,是要先新建一个对象才可以。而main函数作为程序的入口,需要在其它函数实例化之前就启动。或者更具体地说,通常情况下, 如果要运行一个类的方法,必须首先实例化出这个类的一个对象,然后通过调用该对象的方法——即"对象名.方法名()"的方式来运行,但是因为main是程序的入口,这时候还没有实例化对象,因此将main方法声明为static的,这样main()中的代码是存储在静态存储区的,即当定义了类以后,这段代码就已经存在了。在类加载的时候,静态方法——main()方法就会随之加载到内存中去。如果main()方法没有使用static修饰符,那么编译不会出错,但是当你试图执行该程序时,编译器将会报错,提示main()方法不存在。因为包含main()的类并没有实例化(即没有这个类的对象),所以其main()方法也不会存在。而使用static修饰符则表示该方法是静态的,不需要实例化即可使用。

void

从语法上不能写成?)对于java中的main(),jvm有限制,不能有返回值,因此返回值类型为void。因为当main方法出现返回值时,JVM无法进行上抛,如果有返回值难道抛给操作系统么?(JVM外面就是操作系统?)

区分public static void main(String[] args) throws Exception不能这么写的原因
从逻辑上不能写成,并非语法上有问题)抛出异常的目的,一般是为了让调用方处理异常,而主函数main()是最终调用者,没有函数再调用它。如果到main函数这里还往外抛出异常,相当于把异常抛给了JVM,而JVM的处理方式就是让程序挂掉,然后打印异常信息,那就相当于写了异常抛出跟没写一样,都是出了异常,程序挂掉,所以说逻辑上来说没有这么写的,但是这么写是不存在任何语法错误

String[] args

是开发人员通过命令提示行与已开发完的程序代码进行交互的一种手段

参数String[] args是一个字符串数组,接收在执行程序时传入的参数。其中,有博客(文中还提到了命令提示行下,运行Java程序的方法)提到,“args是数组的名字,并不是固定的,可以改成其他名字”——这一点我还没有确认,不确定

自写部分:【比如,命令提示行中执行本段代码:将开发的一个.class文件打成jar包,放到lib目录下。然后在Windows系统的命令提示行中输入指令java -Djava.ext.dirs=lib DailyDownTask.DailyDown0c(jar包内的工程的类DailyDown0c所在的Package包名DailyDownTask) 传入的参数1 传入的参数2 传入的参数3 ...,回车即可。在启动jar包的同时,jar包的代码通过main(String[] args)获取到了刚才输入指令传入的参数】。这也是Windows上安装的Java程序可以通过命令提示行进行操控的原理,例如Jmeter

如果是在控制台,可以通过编译执行将参数传入主函数,命令行如下:
在这里插入图片描述
这样传进main函数的就是一个字符串数组, args[0] =a; args[1]=b;args[2]=c, 如果不传参数进来,args为空。如下所示:
在这里插入图片描述
和上面一样,程序使用者还可以在命令行状态下向某个类传递参数,样例可以看这篇博客,代码的写法可以参考这篇博客

最后,我在网上还看到了一篇好玩的博客;synchronized写法,其中提出了public static void main(String[] args)函数各种不常见的写法,大家感兴趣的可以去看看。我能力有限,目前判别不出这篇文章内容正确与否,还请各位自己判断这篇博客的对错,见谅。如果有大神能确定这篇文章内容的对或错,也欢迎在本博客下留言告诉我,在这提前说声谢谢。

一个Java工程中可以有多个主函数

主函数虽然是Java应用程序的入口,但一个Java工程却可以有多个主函数。工程里的所有代码文件,均以含有主函数的各个class文件为根节点,分成几组,构成多个树形结构。每次在启动Java工程时,eclipse会以当前界面文件为准,打开它属于的根节点文件的主函数

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值