解析java中main函数为什么是这样写

来源:互联网 发布:bear it in mind 编辑:程序博客网 时间:2024/06/04 23:27

我们在写程序的过程主函数都是固定的,但是这是不是意味着完全不能改呢?
不是的,现在就来深入一下主函数的写法意义…

/* * 主函数是一个特殊的函数,作为程序的入口,可被jvm调用 *  * 主函数的定义: * public:代表该函数访问权限是最大的 * static:代表主函数随着类的加载就已经存在了 * void:主函数没有具体的返回值,即为空 * main:不是关键字,但是是一个特殊的单词,可以被jvm识别 * (String[] arr):函数的参数,参数类型是一个数组,该数组中的元素是字符串,字符串 * 类型的数组 *  * 主函数是固定格式的,jvm识别 * */public class MainDemo {    public static void main(String[] args)     {        System.out.println("Hello World!");    }    public static void main(int x)    {        System.out.println("Hello");    }}

可能上面的注释(String[] arr)刚开始以为是写错,事实上它就是代表一个字符串数组,主函数传进来的是一个字符串数组
编译运行后输出的是:Hello World!
首先一看上去我们会有个疑惑,好像出现了两个主函数…
但是,要知道,主函数也是一种特殊的函数,其实这是一种函数的重载,第二个“main函数”传入的是int 类型的参数,参数不同,可以知道这是函数重载,那么,执行的只有第一个真正的main函数,这说明,整个程序的入口还是在真正的main函数,无论把第二个“main函数”放到真正main函数的前面,编译运行的结果都不会变

接下来一个问题,main函数参数String[] 看出是字符串数组,那这个args是什么东西,其实它就是变量名,那么既然是参数里的变量名,就可以任我们取名字了,

public class MainDemo {    public static void main(String[] x)     {        System.out.println("Hello World!");    }}

这个样子编译是通过的,这说明主函数不一定要public static void main(String[] args) 这样子,不过这是一种约定的俗称,我们才把它写为args,这个args原形是arguments(参数),只不过是为了简写,才简化为args。

再来想一个问题,jvm调用main函数,参数为String[] args,那jvm传入的到底是啥?

public class MainDemo {    public static void main(String[] args)     {        System.out.println(args);    }}

编译运行,结果是 [Ljava.lang.String;@15db9742
一眼看过去并不知道这什么东西,再来追究一下看看,分别代表
数组 实体 String类型 哈希值
我们知道,String只有接收两玩意
String[ ] args = new Srting[3] ; //数组实体,有长度
String[ ] args = null; //为空
而根据结果知道并不为null,说明它传入的是一个实体数组,既然数组有了,试一下打印长度

public class MainDemo {    public static void main(String[] args) //new String[]    {        System.out.println(args.length);    }}

运行结果为0
这时可以下一个结论:
jvm在调用主函数时,传入的是new String[0];
接下来试试打印数组元素的值

public class MainDemo {    public static void main(String[] args) //new String [0]    {        System.out.println(args[0]);    }}

运行结果如下

Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 0
at practice.MainDemo.main(MainDemo.java:19)

这是一个数组越界的异常,很正常,因为new String[0],说明里面没有元素,也就不存在第一个元素
这有什么用途呢,既然jvm可以往里面传值,我们也可以传我们需要的值
要执行哪个类,我们就把这个类的类型作为参数传进jvm,而且传这个类的同时它会去调用这个类的main方法,我们可以在这个类的后边继续传一些值,叫做主函数的参数
打开cmd,javac为编译,java即调用了虚拟机,我们就这个时候传值。。

D:>javac MainDemo.java
D:>java MainDemo haha heihei xixi

结果运行结果为:haha
这个时候,上面程序的就不会抛出异常了
args[0]的值为haha
这说明jvm做了这样一件事:将类后面跟的这些数据(空格隔开为一个数据)自动存入到长度为3的数组中,为了验证,我们打印所有数组的元素。

public class MainDemo {    public static void main(String[] args)     {        for(int i=0;i<args.length;i++)            System.out.println(args[i]);    }}

D:>javac MainDemo.java
D:>java MainDemo haha heihei xixi
haha
heihei
xixi

运行OK,三个元素都打印出来,之后还可以把数组元素单独写在代码里进行传值..
至此,关于main方法这些,了解就行

0 0