1.1 Java程序与运行
Java语言是由C语言发展而来的,其继承了C语言的所有优良特征,并去除了C语言的一些容易引起错误的语句,是一个彻底的纯面向对象的程序设计语言,最重要的是Java的可执行代码不依赖于任何现有的操作系统和计算机中的CPU(中央处理器)。
1.1.1 Java语言的特征
Java语言的特征可以高度概括为:Java是一个简单的、面向对象的、分布的、解释的、健壮的、安全的、独立于平台的、可移植的、可扩展的、高性能的、多线程的及动态的程序设计语言。
Java是一个编译和解释型语言,Java的源程序代码通过Java编译器(Sun Microsystems公司提供的Java语言程序开发工具)将Java语言文本代码编译为(翻译为)Java字节代码(称为Java的可执行代码),该代码是运行在Java虚拟机环境中的。Java程序的编译和解释执行的特性如图1-1所示。
图1-1 Java程序的编译和解释执行的特性
1.1.2 Java虚拟机
Java虚拟机(Java Virtual Machine,JVM)是运行Java程序的支持系统,用于解释Java字节代码并执行代码所要完成的操作。Java虚拟机是与计算机硬件和操作系统相关联的,是由发明Java语言的Sun Microsystems公司根据不同的CPU或计算机操作系统制作而成的,即针对不同的CPU或操作系统解释Java字节代码,将Java字节代码翻译为指定的CPU或操作系统可识别并能够执行的指令代码,也就是将Java字节代码转化成实际硬件设备的调用。因此,Java虚拟机针对指定的CPU或操作系统也被称为Java解释器,专门用于支持Java程序运行,是面向Java语言程序的一个独立运行系统(Java Runtime System)。另外,Java虚拟机未必非要运行在某种操作系统之上,其下面可以直接是各种CPU芯片,对于每一种操作系统或CPU,Java解释器是不同的,但实现的Java虚拟机功能是相同的,这就是Java语言程序与平台无关的关键所在。
Java语言应用程序分为两种形式:Application应用程序和Applet小程序。Java源程序通过Java编译器生成可执行的Java字节代码,Application应用程序是由Java虚拟机支持运行的,Applet小程序是由嵌入了Java虚拟机的Web浏览器支持运行的,目前几乎所有Web浏览器都嵌入了Java虚拟机,计算机CPU和Web浏览器支持Java应用程序运行的层次关系如图1-2所示。
图1-2 支持Java应用程序运行的层次关系
Java虚拟机由5个部分组成:一组指令集、一组寄存器、一个堆栈、一个无用内存单元收集器和一个方法区域。这5部分是Java虚拟机逻辑抽象成分,不依赖于任何实现技术或组织,但是它们的功能在某种真实机器上(确定的CPU或操作系统)是一致的。Java虚拟机也有类似微处理器(CPU)中的寄存器,它们用于保存机器的运行状态。Java虚拟机的寄存器有4种:Java语言程序计数器(pc)、指向操作数栈顶端的指针(optop)、指向当前执行方法的执行环境指针(frame)、指向当前执行方法局部变量区第一个变量的指针(var)。Java虚拟机是用堆栈处理数据传递的,它不定义或使用寄存器传递或接收参数,其目的是为了保证指令集的简洁性和实现时的高效性。Java虚拟机的堆栈有3个区域:局部变量区、执行环境区和操作数区。Java虚拟机的堆栈是Java应用程序运行时刻动态分配的对象存储区域并是可自动回收的,Java虚拟机的内部结构和运行机制都是围绕着解释Java字节代码而制定的。
1.1.3 Java字节代码
Java虚拟机可以解释240多个字节代码,每个字节代码的执行相当于一种基础的CPU运算或操作。Java字节代码也可以称为Java语言指令集,相当于Java语言程序的“汇编语言”。Java语言指令集的一条指令有一个操作码、0个或多个操作数,操作码指定实施的操作,操作数是操作码所需的参数,Java语言的操作码均为一字节长,操作数没有限制。由Java字节代码组成的指令是不依赖于任何CPU或操作系统的,而是针对Java虚拟机设计的。Sun Microsystems公司提供的Java语言程序开发环境中的Java编译器可将Java源程序代码编译成Java字节代码指令,这些指令被Java的运行系统(Java虚拟机)有效地解释并运行。另外,Java字节代码也被称为类(class)代码。
1.1.4 Java编译单元
Java语言源程序是由一个或多个Java编译单元(compilation unit)组成的。Java编译单元由Java语句组成,每个编译单元只能包含下列语句内容:一个程序包语句(package statement)、一组导入语句(import statements)、一个或多个类的声明语句(class declarations)、一个或多个接口声明语句(interface declarations)。每个Java的编译单元可包含多个类或接口,但是每个编译单元最多只能有一个类或者接口是公共的。
Java编译单元是以公共的类或者接口名为文件名,以.java为后缀保存在磁盘中的,Java编译器则是针对∗.java文件实施编译的,编译后可生成存放在磁盘中的Java字节代码,字节代码是以.class为后缀的文件名(∗.class)形式存放的,在一个Java编译单元中如果定义了多个类和接口,则编译后每个类和接口都是以独立的类文件名(∗.class,∗为类或接口名)存放在磁盘中的。
【示例1-1】 Java编译单元的程序源代码,包含两个类,但只有一个被修饰为公共(public)类。
该编译单元以HelloWorld.java(公共类名)为文件名存放在磁盘中,通过Java编译器编译后在磁盘中将产生HelloWorld.class和AnotherClass.class两个类文件,它们组成了HelloWorld.java编译单元的可执行字节代码。
【示例1-2】 包含一个公共(public)接口的一个编译单元的程序源代码。
该编译单元以InterfaceName.java(公共接口名)为文件名存放在磁盘中,通过Java编译器编译后将在磁盘中产生以InterfaceName.class为文件名的类文件。
Java编译单元中的源程序框架结构是确定的,Java程序要实现的功能都应该编写在类或接口中,源程序代码将由标识符、关键字、变量定义、表达式、流控制语句等按照Java语法规则组成,它们都应编写在Java编译单元中类或接口定义的花括号{}中。