1.3 Java程序运行机制


经典解释如图所示:




疯狂java第三版 疯狂java讲义第三版pdf_javac



Java程序的执行过程必须经过先编译、后解释两个步骤。


具体点,Java编译器将Java源文件编译成(与平台无关的)字节码文件,然后Java解释器(即Java虚拟机——JVM)将Java字节码文件解释成指定平台的机器码。




其中,Java编译器与平台无关,只有一种。


           字节码文件与平台无关。


           Java解释器与平台相关,不同平台上的JVM都是不同的,须为不同平台实现相应的虚拟机。


           机器码自然与平台相关了。




所有平台上的JVM向编译器提供相同的接口,而编译器只需面向虚拟机,生成虚拟机能理解的字节码即可。




书中介绍了一种形象的比喻,非常值得一提:



疯狂java第三版 疯狂java讲义第三版pdf_运行机制_02




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,如下所示:



疯狂java第三版 疯狂java讲义第三版pdf_疯狂java第三版_03




3.(与平台相关的)机器码



Java解释器(JVM)执行类。


执行"java Test1",将执行类Test1的代码体。注意,java后跟的是类名而不是.class文件名,然而仍需要字节码文件名与类名一致,因为java命令须按照后面的类名找到相应的字节码文件,进而找到字节码文件中的Java类。


执行后如图所示:



疯狂java第三版 疯狂java讲义第三版pdf_运行机制_04