1.3 Java
Java是面向对象程序设计语言,它具有平台无关性和自动垃圾收集等功能,还具有与C和C++类似的语法。在Java于20世纪90年代出现之后,围绕它陆续出现了许多产品,如Java applet、EJB、servlet、JINI等。所有主要的Web浏览器都支持Java,给Internet用户提供Java功能支持。
Java语言是Sun Microsystems的James Gosling于1991年创建的。Gosling是负责预测和开发下一代计算技术的Green Team的13个成员的组成部分。该团队完全用Java语言开发了一个生动的、可视化的远程控制设备(被称为*7或StarSeven)。
虽然*7是个失败的商业产品,但是Sun Microsystems团队却发现了Java技术的潜在载体——Internet。Web浏览器Mosaic于1993年发布,并为Internet站点提供了一个简单的用户界面。当Internet需要传输多媒体文件的时候,Web浏览器就依赖于静态的HTML来描绘可视化的内容。1994年,Sun Microsystems发布了一个称为Hot Java的新的Web 浏览器,它能够显示动态的、生动的内容。
为了被广泛采用,Sun Microsystems于1995年公开发布了Java源代码。公开的源代码也从其他的开发人员的审查中获益不少,他们不断地找出了代码中遗留的bug。1995年,Sun Microsystems执行官和Netscape创办者Marc Andreessen宣布Netscape Navigator浏览器将支持Java技术。
1.3.1 语言特性
Java是一种流行的、与平台无关的、面向对象的编程语言。它在包含许多现代化的特性的同时,也保留了与C/C++类似的语法,所以有经验的程序员能很容易地学习Java。
1. 面向对象
Java是面向对象的程序设计语言。面向对象程序设计有以下几个优点。
● 封装:使用类将代码进行组成和模块化。数据结构、数据和操作数据的方法都被封装在一个类结构里。
● 继承:面向对象的组织和封装使程序员更易于重用或“继承”以前的代码,由于继承使程序员不需要重写以前实现的函数,从而节省了时间。
● 数据隐藏:对象,或者说是类的实例,可以包含类外部的方法不能改变的数据。程序员可以使用private来指定变量,以实现数据隐藏。
● 抽象数据类型:程序员可以定义类(通常被视为C语言中struct命令的扩展)。类中可以包含程序员自定义的数据类型,同样也可以包含关于这种类型对象的操作。
2. 平台无关性
因为Java是解释型而并非编译型的语言,所以Java程序是平台无关的。这就是说,Java编译器生成的是“字节代码”,而不是C或C++编译器生成的本地机器码。Java字节代码能被多种不同的平台解释。需要指出一点,解释型语言的执行速度天生就比本地编译语言慢。
3. 多线程
Java支持多线程,因此,Java可以同时执行多个任务。包java.lang中的thread类提供了线程相关的功能。
4. 安全性
在“安全程序设计语言”仍然处于开发阶段的时候,Java已经提供了老的编程语言(如C/C++)所缺乏的安全特性。首先,最重要的是Java提供了成熟的内存管理和数组边界检测机制。缓冲区溢出攻击对Java程序是无效的,因为Java已经排除了这种最常见的威胁。另外,Java还能阻止智能代码的攻击,如将整数赋给指针以获取未授权的访问权限来限制应用程序或操作系统的某些功能。
Java还使用了sandbox的概念。sandbox为在其中运行的代码行为设置了限制条件,从而保护了内存和sandbox外的其他数据不受恶意代码的攻击。Java通过两种方法来实现sandbox模型:字节码检测和运行时校验。字节码检测通常在类加载期间执行,以保证代码正确无误。例如,在字节码层次上执行类型检测,屏蔽向原始类型发送消息等逻辑操作。
5. 高级特性
Java的许多高级特性并没有被列入上述特性中。Java支持类的“动态加载”。类中的一些性能只在需要的时候才加载,以节省带宽、缩小代码长度、提高执行速度。虽然LISP语言等也支持动态加载(20世纪80年代后期用C语言添加的支持),但是Java更适用于通过网络无缝加载所需的类。ClassLoader类用于处理所有的类加载。
像LISP、ML和其他一些语言一样,Java也提供了自动的“垃圾收集器”。程序员必须清晰地释放没用的内存空间。这有利于防止内存泄漏,保证内存在使用的时候被释放。
1.3.2 Hello,World!实例
“Hello World!”程序通常被作为最简单的入门程序来介绍。初级程序员通常通过开发“Hello World!”来理解语言的基础结构,学习编译和运行程序的过程。下面是用Java语言编写的“Hello World!”实例。
例1-10 Hello World!
1 class helloWorld{
2 public static void main( String [] Args ){
3 System.out.println( "Hello, World!" );
4 }
helloWorld类包含一个main方法,在默认情况下,它携带一个String类型的数组参数。main方法是public类型的,因此外界可以访问helloWorld类;用void关键字来指定没有返回值。println语句是System.out类的一个方法。println在命令行的标准输出接口中输出字符串“Hello World!”。下面介绍数据类型和方法的相关概念。
1.3.3 数据类型
程序设计语言中的数据类型用于在变量初始化之前对其进行定义。数据类型指定变量在内存中的存储方式和变量的保存类型。变量可以说是数据类型的一个实例。
Java语言提供两种数据类型:基本数据类型和引用数据类型。其中基本数据类型包括以下几种。
● byte:表示占用1个字节内存空间的整数。
● short:表示占用2个字节内存空间的整数。
● int:表示占用4个字节内存空间的整数。
● long:表示占用8个字节内存空间的整数。
● float:表示浮点数,每个浮点数占用4个字节的内存空间。
● double:表示双浮点数,每个浮点数占用8个字节的内存空间。
● char:表示字符,在Java中,一个char表示一个16位的unicode字符。
● boolean:表示true或false两种状态之一。
在平台相关的语言如C中,为不同数据类型分配的内存空间是不明晰的。但是,由于Java是平台无关的,语言中已经指定所有数据类型的大小和格式,因此,程序员不需要考虑由于系统差异引起的相关操作。
当数据元素是用于指向内存地址而不是包含数据时,Java也会使用引用类型。array、object和interface都是引用类型数据。图1-2列出了Java的数据类型及其分类。

图1-2 Java的数据类型及其分类
1.3.4 流程控制
Java使用循环结构来控制程序流程。在写程序的时候,某些任务需要重复指定的次数或遇到终止条件才能结束。循环是简化重复任务的编程结构,有3种主要类型:for、while和do…while。
例1-11 for循环
for( Start_Condition ; Test_Condition ; Operation ){
[Statement Block];
}
for循环是最常用的循环结构。在循环开始执行的时候,它会检查关键字for后的条件。对于给定的Start_Condition,如果Test_Condition的值为真,则执行循环体。循环中的第3个参数Operation表示要对Start_Condition进行的操作。循环将一直执行,直到Test_Condition为假时才结束。
for循环特别适用于迭代。如果程序员希望Statement Block执行5次,则可以进行如下设置:
for( i = 0 ; i < 5 ; i++ ){
[Statement Block];
}
例1-12 while循环
while( condition ){
[Statement Block];
}
在while循环中,循环一开始就要执行循环条件。如果循环条件的值为真,则执行循环体;如果为假,则退出循环。直到循环条件变为假时,循环才会停止。
例1-13 do…while循环
do{
[Statement Block];
} while( condition );
在do…while循环中,循环条件是最后才被检查的。在执行循环体之后,循环条件才决定是否继续执行循环。如果循环条件的值为真,则继续执行循环;如果为假,则循环终止。在do…while循环中,在检查循环条件之前循环体至少被执行一次,除了这点以外,其他和while循环很相似。因此,for循环和while循环使用得更频繁。
有一点需要指出,上述3种循环结构在功能上是等效的。
例1-14 等效循环——通过循环迭代5次
for循环:
for( i = 0 ; i < 5 ; i++ ){
Statement_Block;
}
while循环:
int i = 0;
while( i < 5 ){
Statement_Block;
i++;
}
do…while循环:
int i = 0;
do{
Statement_Block;
i++;
} while( i < 5 )
在上述示例中,循环体被执行了5次。虽然使用不同的循环方法,但是结果是一样的。换句话说,可以认为所有的循环类型在功能上是等效的。






