JAVA-初步认识-第七章-this关键字main函数解析

一.

对主函数public static void main(String[] args)解惑:

主函数是一个固定写法的函数,它也是一个一般函数,但是它特殊在哪?

固定格式为什么这么写?

public:因为权限必须是最大的,权限小,对虚拟机不利,如果写成private,怎么访问?

static:虚拟机在调用主函数的时候,它是不需要对象的,直接用主函数所属类名即可。

java StaticDemo中的java是在启动虚拟机,启动完了之后,告诉运行这个类。虚拟机直接拿着这个类名.main(也就是StaticDemo.main),调用相应的方法。需要new StaticDemo这个对象吗(这句话的意思是,之前调用方法时,都是对象调用,或者类调用)?不用,如果new对象,就麻烦了。new对象意味着,产生很多。哪个对象调用的,里面是不是有特殊数据?搞不清楚。直接用类名调用就完事了。

void:主函数没有具体的返回值。

为什么?返回谁?有确定方向么?不是返回给调用者么,有返回方向,谁调用返回给谁。真要返回的话,返回给java虚拟机。返回时必须的,结束是必须的。给虚拟机一个整数类型的值,有什么用?虚拟机不需要返回值,把入口做完就结束了。

mian:是函数名,不是关键字,只是一个jvm识别的固定的名字而已。

String[] args:这是主函数的参数列表,是一个数组类型的参数,而且元素都是字符串类型。

二.

任何函数被调用,如果它有参数,都要传递相对应的实参。传递的实参是什么?谁在调用主函数?虚拟机在调用主函数。原理就是如果有参数,必须传递相应的实参,如果不传,相当于没有调用函数,那么到底传递了什么实参?如果不知道传递的是什么,如果想要知道,那么如何验证。args就是一个变量,直接打印一下,看输出就知道了。

上面DOS的结果显示,@c17164是哈西值,左边[是数组,L是long,String是String类型,说的是这个数组里面存储的是字符串类型的数据。我们能看到这个,说明什么?说明虚拟机在调用主函数的时候,确实给main方法传递了一个字符串类型的数组实体。这是必须的,为什么呢?因为如果没有实体的话,打印结果为空。有实体怎么看出来的,c17164是地址,有这个哈西地址就对了,那就证明有实体。所以,它应该是创建了一个数组实体对象。紧跟着,我们问题的纠结不在这。确实创建了一个字符串类型的数组,new String[],长度是多少呢?数组一建立,必须有长度,这就郁闷了,长度是多少?通过args.length打印,结果显示长度为0。由此可以得出,虚拟机在调用主函数的时候,它在往里传的是一个new String[0],最终虚拟机往里面传的是这样一个参数,它并没有往里面传元素,因为长度为0。

看着这个jvm输入的实参好像没什么意义。之所以主函数带着这样一个形参,是因为我们在运行java程序时,我们可以在运行程序的同时,指定一些具体的参数值,所以在程序入口的时候,人家给你留了余地了,你把一些你需要程序运行的数据通过这个入口,传输进去,你可以传你自定义的东西,这就是主函数留有参数的原因。为什么数据那么多类型,要留这个类型?原因:1. 如果,你要往里传参数,你传什么,无论是想传整数,浮点数,最终都是字符串,而且我们可以将字符串进行其他类型的转换,所以字符串类型的数据才是最通用的数据。解释一下,如果你在上网的时候,有这么一个文本框,写着请输入你的年龄,你输入一个24,确定说你是不是可以结婚,一输24,咔一整,你可以结婚。有没有,你可以结婚。这24你输入进去的是什么,其实是一个字符串,那不是整数,文本框里面全都是文本,它只有把文本转成了数字才是数字,所以字符串这种数据最通用。如果我想传一个字符串,如果想传多个怎么办?没关系,数组。数组就是多个,这就解决了。

能行吗?操作一下。输入args[0],就是在访问args数组的0角标元素。DOS结果显示如下,由于长度是0,不存在0角标,所以显示为角标越界。

现在不准备让它角标越界,注意,编译都不编译,什么时候传值?是不是说调用函数的时候传值,java MainDemo,我一启动java虚拟机,告诉运行这个类,它是不是拿着我这个类,调用主函数,就在这传值。虚拟机在调用主函数的时候,就直接往里传值,怎么传?在类名的后面敲一空格,这一块可以写东西,比如说“haha”,紧跟着“hehe”,“xixi”,一回车,

 

 结果显示为,有三个元素,首个元素为haha。单词想要分界,要加空格。虚拟机看到类名的后面有内容的时候,它就会把这些内容以空格方式分隔,作为数组中的元素,进行封装,然后再把数组传给args,这个时候的数组就不再是0了,是3,并带着元素内容。

仔细观察上面的截图,for语句中的输出语句位置在后面,有什么讲究么?如果for语句和输出语句写在同一列会怎么样

而且这里有时好像缺少一个编译,即javac,下面的截图中,只有java命令,而没有javac命令。

这叫做给主函数传值,我在使用一个应用程序时,可以指定我需要的数据,但是用的多不多呢?不多,因为这些未知数据(视频中喜欢将确定的输入数据称之为未知数据)往往用户不会用,因为你能告诉用户说,搞一后台,写个java,写个类名,把未知数据写上,用户不会用,所以我们怎么办?我们做了图形化的界面,留了几个windows框,请往这里面输入,这才有长度的事情,这样做用的很舒服。

主函数基本讲完。

三. 小细节

将主函数中的形参进行了修改,将args变成了x,是否行的通?

虽然说主函数是固定格式的,但是括号中的形式参数,args就是变量名,变量爱写什么就写什么,唯一能变化的就是args。

但是从来没有见过它变化,最早期,是写的arguments(参数),为了方便书写,简写成args。

又做了一些变化,main的括号里写了int x,能存在么?看着像是两个入口,其实不然,主函数是固定格式,所以下面的main(int x)并不是主函数。这么写顶多是方法名相同的,参数列表不同的的重载形式。如果写成public static void main(String[] x)这就出错了,真成了两入口。

 

posted @ 2017-10-14 21:58  前锋营  阅读(664)  评论(0编辑  收藏  举报