1.3 Java程序运行机制
经典解释如图所示:
Java程序的执行过程必须经过先编译、后解释两个步骤。
具体点,Java编译器将Java源文件编译成(与平台无关的)字节码文件,然后Java解释器(即Java虚拟机——JVM)将Java字节码文件解释成指定平台的机器码。
其中,Java编译器与平台无关,只有一种。
字节码文件与平台无关。
Java解释器与平台相关,不同平台上的JVM都是不同的,须为不同平台实现相应的虚拟机。
机器码自然与平台相关了。
所有平台上的JVM向编译器提供相同的接口,而编译器只需面向虚拟机,生成虚拟机能理解的字节码即可。
书中介绍了一种形象的比喻,非常值得一提:
1.5 第一个Java程序
为什么把这两节放在一起做笔记呢?因为这两节都是对Java基础层次的理解,前后连贯,1.5是对1.3的实践证明。
这一节中重点介绍用最基础的命令“javac”、“java”编译运行Java程序。
javac(java compile的缩写)可以将Java源文件中的类分别编译成各自的字节码文件。java负责运行指定的类。
举例说明:
1. Java源文件
Java源文件名为Test.java,源代码如下:
class Test1
{
public static void main(String args[])
{
System.out.println("Javac and java test.");
}
}
class Test2
{
}
若源文件中含有public类,则源文件名必须与public类的类名相同。否则,源文件名可以随意(如上)。
而Java解释器(JVM)规定,若需要某个类被解释器解释执行,则该类必须包含main方法。而main方法头部的写法几乎是固定的。
2.(与平台无关的)字节码文件
Java编译器将Java源文件中的类分别编译成对应的字节码文件,即Java源文件中的一个类对应一个字节码文件,且字节码文件名默认与类名一致。
执行“javac Test.java”将上述Java源文件编译成功后,生成两个字节码文件:Test1.class、Test2.class,如下所示:
3.(与平台相关的)机器码
Java解释器(JVM)执行类。
执行"java Test1",将执行类Test1的代码体。注意,java后跟的是类名而不是.class文件名,然而仍需要字节码文件名与类名一致,因为java命令须按照后面的类名找到相应的字节码文件,进而找到字节码文件中的Java类。
执行后如图所示: