好好学Java:从零基础到项目实战
上QQ阅读APP看书,第一时间看更新

1.3.1 Java程序的运行机制

在编译Hello World程序时会生成名叫Hello.class的中间文件,但该文件并非.exe那样的可执行程序,而是Java特有的字节码文件。在Windows系统上,通过Java命令可以运行.class文件,把.class文件原封不动地传到Linux系统上,也能通过Linux的Java命令运行.class文件。这意味着编译出来的.class文件是跨平台的,不会因为操作系统的改变而失效。

跨平台运行是Java编程的一大创举,它减少了程序移植的工作量,切实提高了程序开发的效率。在Java诞生之前,多数编程语言的程序依赖于编译时候的操作系统,一旦把程序挪到另一种系统上,那么该程序将无法正常运行。以C++为例,在Windows系统编译出来的是.exe文件和.dll库文件,但.exe与.dll文件不能在Linux系统上运行;在Linux系统编译出来的是.o文件与.so库文件,但.o与.so文件不能在Windows系统上运行。也就是说,C++做不到跨平台运行,其代码在不同系统上的编译运行情况如图1-36所示。

那么Java是怎样实现跨平台运行的呢?这缘于Java引进了虚拟机的概念。所谓虚拟机,指的是一个虚构出来的计算机,它通过模拟实际计算机的功能来接管程序对系统底层的调用。这相当于在程序与操作系统之间增加了一层媒介,程序只管与媒介沟通,不管与系统的交互,因为底层操作都交给媒介与系统沟通了。好比租房子,房东只需把钥匙交给中介,接下来找租客、看房子等事项都让中介去办。

当然,虚拟机早就有了,只是Java将其发扬光大,为此制定了专门的Java虚拟机规范(Java Virtual Machine,JVM)。引入Java虚拟机之后,Java代码编译出来的class文件可以直接传送到别的系统平台运行,而无须在这些平台上重新编译。Java代码在不同系统上的编译运行情况如图1-37所示。

图1-36 C++代码在不同系统上的编译运行情况

图1-37 Java代码在不同系统上的编译运行情况

任何系统平台,只要事先安装了该平台对应的Java虚拟机,就能让class文件在它上面运行,从而实现“一次编译,到处运行”的美好愿景。