JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
public class Hello{ public static void main(String[] args){ System.out.println("hello world"); } }
以上面代码为例,展开以下问题的讨论:
一、Hello是我们自己定义的一个类,为什么写java代码的时候要写一个类?
答:在java中,类是组织代码的基本单元。在类中,可以编写方法。在方法里面,是需要JVM去执行的一行行代码。(我们平时所说的代码执行,就是这些方法中的代码)
JAVA语言中规定,大多数情况下,需要把执行的代码写在方法中,把方法写在类里。所以写代码时一般都先定义一个类,类中定义一个方法,然后把要执行的代码写在方法中。
这里所说的类中和方法中,具体的表现形式,就是一对花括号{}。
public class Student{ //这里是就是类中 }
public class Student{ public void run(){ //这里就是方法中,当然这个方法整体也在类中 } }
二、Hello类中的方法名为什么是main?
答:main方法是java中的一个特殊方法,它是作为java程序的唯一入口而存在的。
思考:一个项目中写了好几个百个类,每个类中的方法加起来一共又有上千个方法,那么当JVM加载了这么多个类和方法的时候,JVM应该从什么地方开始运行程序呢?
答:java中使用了一个固定的方法来作为程序的入口,无论写了多少个类,多少个方法,JVM一定是从这个固定的程序入口方法开始执行代码的,为了能够让JVM很好的识别这个入口方法,这个方法的编写形式就是固定的。
//这是java中的程序入口方法,一切代码的执行,都要从这里开始 public static void main(String[] args){ //方法中,就可以编写一行行需要运行的代码了 }
我们在Hello类中定义一个main方法,让JVM运行Hello这个类时,可以直接接从类中
的程序入口方法,也就是main开始运行代码,又由于main方法是固定的写法,所以JVM很容易就把它识别出来,然后去运行它,main方法被运行了,那么main中的代码就会被一行行的顺序执行了。
思考;如果一个类中没有编写固定形式的main方法,那么使用java命令去运行这个类,会发生什么?为什么?在这情况下,如果还想使用这个Hello类,该怎么办?
三、System.out.println(“hello world”);,谈谈你对这句代码的理解。
答:System是JavaSE(Java 2 Platform, Standard Edition)的API(application program interface—>应用程序编程接口)中提供的一个类;(注意:S要大写)
out是System中的一个属性;
println是out中的一个方法;
System.out是访问System类中的一个属性,System.out.println是调用out中的一个方法,而println(“hello world”),就是将字符串"hello world"输出到命令行或控制台中。
四、在Hello类中为什么可以使用System这个类?
当前 Hello类中,是没有声明 package(包)的,那么这时候 Hello类就算是在默认包中,而 System类,是在 java.lang包下定义的,所以当前情况下, Hello类中不使用import导入,也可以直接使用 System类。
五、使用java运行这个类时,JVM通过什么找到Hello.class文件的?
答:通过CLASSPATH环境变量配置的路径,来查找的Hello.class文件的,如果配置的路径不对,那么运行Hello时会报错(找不到这个类)。
配置JDK的三个环境变量的时候,若把CLASSPATH配置的路径就是点(.),表示当
前路径。
六、能否看到JVM去启动运行Hello类之前,确实从rt.jar中加载到了System这个类?
答:可以,只需要在运行Hello类的时候,加一个参数即可:
java -verbose Hello
verbose参数可以将JVM启动运行的时候加载的信息输出出来,由于内容太多,这里可以做一个输出重定向:
java -verbose Hello > a.txt
(这个操作在Windows里面也是一样的)
通过文件中记录的输出内容,就可以看到JVM在运行Hello这个类之前,整个加载的过程和顺序。(这里JVM其实就是给我们自己编写的类Hello,准备运行的环境。)
rt.jar中rt就是runtime的缩写,表示运行时环境的意思。
七、Hello这个类的名字和Hello.java的名字有什么联系吗?
答: