当读者看到这个标题时,一定还在想,HelloWorld这么简单,我上课第一节课就是这个,可是你想过它的底层原理吗?为什么可以输出字符串到控制台?这之间究竟发生了什么吗?于是,这便是我们讨论的内容了,首先贴代码:
HelloWorld代码
首先,看到这串代码,我们会有几个问题。
第一个问题:System.out.println可以输出字符串,但是为什么可以输出字符串,为什么不可以直接print()输出,于是,我们按住ctrl+鼠标左键,或者F3,进入到方法源码里面去:
System源码
可以看到,这是一个常量类,于是我们继续往下找:
out部分代码
我们可以通过右边的Outline快速查找,可以看到,这是一个常量+静态的属性,也就意味着,可以直接调用System.out。这就解释了第一个问题的一半了,于是我们接着往下走,在out属性那里,按住ctrl键,会出现Open declaration Type,点击进入,就可以看到方法啦:
Out在PrintStream类里
看到类名PrintStream,就可以知道这是一个打印类了,我们继续在方法里面,找print方法,在右边工具栏,会更容易看到。
print方法
看到这里,也就恍然大悟了,System是一个类,out是一个静态变量,print是一个方法,所以可以直接调用。
write方法
至于这里的write方法,就不细讲了,因为看代码,会扯到Buffer缓冲区,synchronized高并发之魂,以及JVM编译,还要补一下操作系统的知识等等。
第二个问题:为什么main方法里,要写成(String[] args){}
答:String[] args是main函数的形式参数,可以用来获取命令行用户输入进去的参数。public static void main(String[] args)是固定的入口形式,不能变。
比如编译文件的时候java HelloWorld a b c,这样String[] args就是[a,b,c];
第三个问题:Java是怎么执行的,你肯定会回答Java -c 编译成class字节码文件,然后再Java,就可以了。答案也正确,可是在这过程中究竟发生了什么呢?
首先是Java -c 编译成.class(类字节码)文件,而这文件,操作系统是能认识的,有个小建议,就是先了解一下计算机操作系统,不用钻太深,了解之后,更容易形成一个体系。
之后再Java 运行,这里便是重点了,首先,JVM虚拟机装载.class,JVM虚拟机可以让程序在不同的系统上(Windows,Linux),也可以实现相同的功能,接着,便是类装载器(JVM)装载类字节码(class文件)。
java中,类加载器把一个类装入JAVA虚拟机需要经过三个步骤来完成:装载、链接、初始化,其中链接又分来校验、准备、解析过程
装载:查找和导入.class文件
连接:检查装入.class文件的正确性,然后,java虚拟机为变量分配内存,设置默认值
初始化:把符号引用变成直接引用。
在书中,深入理解Java虚拟机讲到了这个。
于是这样,helloworld就输出啦!
旁白:JVM虚拟机最好两年工作经验学比较好,并且要有操作系统的基础,有C的基础,毕竟Java是基于C语言的。
网友评论