解析java中main函数为什么是这样写
2016-07-14 11:19
260 查看
我们在写程序的过程主函数都是固定的,但是这是不是意味着完全不能改呢?
不是的,现在就来深入一下主函数的写法意义…
可能上面的注释(String[] arr)刚开始以为是写错,事实上它就是代表一个字符串数组,主函数传进来的是一个字符串数组
编译运行后输出的是:Hello World!
首先一看上去我们会有个疑惑,好像出现了两个主函数…
但是,要知道,主函数也是一种特殊的函数,其实这是一种函数的重载,第二个“main函数”传入的是int 类型的参数,参数不同,可以知道这是函数重载,那么,执行的只有第一个真正的main函数,这说明,整个程序的入口还是在真正的main函数,无论把第二个“main函数”放到真正main函数的前面,编译运行的结果都不会变
接下来一个问题,main函数参数String[] 看出是字符串数组,那这个args是什么东西,其实它就是变量名,那么既然是参数里的变量名,就可以任我们取名字了,
这个样子编译是通过的,这说明主函数不一定要public static void main(String[] args) 这样子,不过这是一种约定的俗称,我们才把它写为args,这个args原形是arguments(参数),只不过是为了简写,才简化为args。
再来想一个问题,jvm调用main函数,参数为String[] args,那jvm传入的到底是啥?
编译运行,结果是 [Ljava.lang.String;@15db9742
一眼看过去并不知道这什么东西,再来追究一下看看,分别代表
数组 实体 String类型 哈希值
我们知道,String只有接收两玩意
String[ ] args = new Srting[3] ; //数组实体,有长度
String[ ] args = null; //为空
而根据结果知道并不为null,说明它传入的是一个实体数组,既然数组有了,试一下打印长度
运行结果为0
这时可以下一个结论:
jvm在调用主函数时,传入的是new String[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的数组中,为了验证,我们打印所有数组的元素。
D:>javac MainDemo.java
D:>java MainDemo haha heihei xixi
haha
heihei
xixi
运行OK,三个元素都打印出来,之后还可以把数组元素单独写在代码里进行传值..
至此,关于main方法这些,了解就行
不是的,现在就来深入一下主函数的写法意义…
/* * 主函数是一个特殊的函数,作为程序的入口,可被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对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树