您的位置:首页 > 编程语言 > Java开发

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

2016-07-14 11:19 260 查看
我们在写程序的过程主函数都是固定的,但是这是不是意味着完全不能改呢?

不是的,现在就来深入一下主函数的写法意义…

/*
* 主函数是一个特殊的函数,作为程序的入口,可被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方法这些,了解就行
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java jvm main