第 1 章 Java语言概述 本章主要内容 * Java语言的特点; * Java虚拟机; * Java源文件(.java)与Java字节码文件(.class); * Java应用程序的结构与主类。 Java语言是一种简单易用、完全面向对象、与平台无关、安全可靠、主要面向Internet 的开发工具,是一种完全面向对象的程序设计(Object Oriented Programming,OOP)语言。 1.1 Java语言的诞生与发展 Java语言诞生于20世纪90年代初期,从它正式问世以来,它的快速发展已经让整 个Web世界发生了翻天覆地的变化。Java语言的前身是Sun Microsystems公司(简称Sun 公司,该公司于2009年4月被Oracle公司收购)开发的一种用于智能化家电的名为Oak(橡树)的语言,它的基础是当时最为流行的C和C++语言。但是,由于一些非技术上的 原因,Oak语言并没有得到迅速推广。直到1993年,WWW(万维网)迅速发展,Sun公 司发现可以利用Oak语言的技术来创造含有动态内容的WWW网页,于是已受人冷落了 的Oak语言又被重新开发和改造,并将改造后的Oak语言改名为Java语言(Java是太平 洋上一个盛产咖啡的岛屿的名字)。终于,在1995年Java这个被定位于网络应用的程序 设计语言被正式推出。 由于Java语言功能强大,其问世后不久,即被业界广泛接受,于是IBM、Apple、 DEC、Adobe、HP、Oracle、Toshiba、Netscape和Microsoft等大公司均购买了Java语言 的许可证。同时,众多软件开发商也开发了许多支持Java语言的产品。 程序设计基础 第8版 2 随着Java Servlet的推出,Java语言极大地推动了电子商务的发展。Java Server Page(JSP)技术的推出,更是让Java语言成为基于Web应用程序的首选开发工具。Internet的 普及和迅猛发展,以及 Web技术的不断渗透,使得Java语言在现代社会的经济发展和科 学研究中占据越来越重要的地位。 1.2 Java语言的特点 Java语言是一种跨平台、适合于分布式计算环境的面向对象编程语言。它具有很多 特点,如简单易学、面向对象、平台无关性、分布式、可靠性、安全性、支持多线程、支 持网络编程、编译与解释并存、可移植性、高性能、动态性等。下面介绍Java语言的几 个重要特点。 1.简单易学 Java语言虽然衍生自C++,与C++相比Java是一个完全面向对象的编程语言。出于 安全性和稳定性的考虑,Java去掉了C/C++支持的三个不易理解和掌握的数据类型:指 针(pointer)、联合体(unions)和结构体(structs)。而C/C++中联合体和结构体的功能, 完全可以在Java中用类及类的属性等面向对象的方法来实现,这不但更加合理规范,而 且还降低了学习难度。 2.面向对象 Java语言最吸引人之处,就在于它是一种以对象为中心、以消息为驱动的面向对象 的编程语言。面向对象的语言都支持三个概念:封装、继承和多态,Java语言也是如此。 3.平台无关性 Java是与平台无关的语言。所谓平台其实就是指由操作系统和处理器所构成的运行环 境,与平台无关就是指应用程序的运行不会因为操作系统或处理器的不同而无法运行或出 现错误。可以说平台无关性是指一个应用程序能够运行于各种不同的操作系统上,即使用 Java语言编写的应用程序不用修改就可在不同的软硬件平台上运行。平台无关有两种:源 代码级和目标代码级。Java语言是靠Java虚拟机(JVM)在目标代码级实现平台无关性的。 4.分布式 分布式包括数据分布和操作分布。Java语言支持这两种分布性。Java语言提供了一 整套网络类库,开发人员可以利用类库进行网络程序设计,方便地实现Java语言的分布 式特性。 5.可靠性 Java语言具有很高的可靠性。Java解释器运行时实施检查,可以发现数组和字符串 访问的越界等错误;另外,Java语言提供了异常处理机制,可以把一组错误的代码放在一 个地方,这样可以简化错误处理任务,便于恢复。 第1章 Java语言概述 3 6.安全性 Java语言具有较高的安全性。当Java字节码进入解释器时,首先必须经过字节码校 验器的检查;其次,Java解释器将决定程序中类的内存布局;再次,类装载器负责把来自 网络的类装载到单独的内存区域,避免应用程序之间相互干扰破坏;最后,客户端用户还 可以限制从网络上装载的类只能访问某些文件系统。综合上述几种机制,使得Java成为 安全的编程语言。 7.支持多线程 Java语言在两方面支持多线程:一方面,Java环境本身就是多线程的,若干系统线 程运行,负责必要的无用单元回收、系统维护等系统级操作;另一方面,Java语言内置多 线程机制,可以大大简化多线程应用程序开发。 8.支持网络编程 Java语言通过其提供的类库可以处理TCP/IP,用户可以通过URL地址在网络上很方 便地访问其他对象。 9.编译与解释并存 Java语言的编译器并不是把源文件(扩展名为.java)编译成二进制码,而是将其编 译成一种独立于机器平台的字节码(扩展名为.class的文件)。字节码可以被Java解释器 所执行,由解释器将字节码再翻译成二进制码,使程序得以运行。 1.3 Java语言规范 Java语言有严格的使用规范,Java语言规范是对Java程序设计语言的语法和语义的技 术定义,如果编写程序时没有遵守这些规范,计算机就不能理解程序。Java语言还为开发 Java程序而预定义了类和接口,称为应用程序接口(Application Program Interface,API)。 目前Java技术主要包括如下三方面: Java SE(Java Platform Standard Edition):Java平台的标准版,可以用于开发客户端应 用程序,应用程序可以独立运行。 Java ME(Java Platform Micro Edition):Java平台的精简版,用于开发移动设备的应 用程序。不论是无线通信还是手机,均可采用Java ME作为开发工具及应用平台。 Java EE(Java Platform Enterprise Edition):Java平台的企业版,用于开发服务器端的 应用。例如,Java Servlet、JavaServer Pages(JSP)及JavaServer Faces(JSF)等。 由于Java SE是基础,因此其他Java技术都基于Java SE,Java SE 17对应的Java开 发工具包称为JDK 17,本书采用JDK 17介绍Java程序设计。 1.4 Java虚拟机 大部分计算机语言程序都必须先经过编译(compile)或解释(interpret)操作后,才 程序设计基础 第8版 能在计算机上运行。然而,Java程序(.java文件)却比较特殊,它必须先经过编译的过程, 然后再利用解释的方式来运行。通过编译器(compiler),Java程序会被转换为与平台无关 (platform-independent)的机器码,Java称之为“字节码”(byte-codes)。通过Java的解 释器(interpreter)便可解释并运行Java的字节码。图1.1说明了Java程序的执行过程。 Java 源文件 编译器字节码 文件 解释器 App.javaApp.class 图1.1 Java程序的执行过程:先编译,后解释 字节码是Java虚拟机(Java Virtual Machine,JVM)的指令组,和CPU上的微指令码 很相像。Java程序编译成字节码后文件尺寸较小,便于网络传输。字节码最大的好处是可 跨平台运行,即Java的字节码可以编写一次,到处运行。用户使用任何一种Java编译器将 Java源程序(.java)编译成字节码文件(.class)后,无论使用那种操作系统,都可以在含 有JVM的平台上运行。这种跨越平台的特性,也是让Java语言迅速普及的原因之一。 Java虚拟机不是物理机器,而是一个解释字节码的程序,所以任何一种可以运行 Java字节码的软件均可看作Java虚拟机(JVM),如浏览器与Java开发工具等皆可视 为一部JVM。很自然地,可以把Java的字节码看成是JVM上运行的机器码(machine code),即JVM负责将字节码解释成本地的机器码,所以说JMV就是解释器。所以从 底层上看,JVM就是以Java字节码为指令组的“软CPU”。可以说JVM是可运行Java 字节码的假想计算机。它的作用类似于Windows操作系统,只不过在Windows上运行 的是.exe文件,而在JVM上运行的是Java字节码文件,也就是扩展名为.class的文件。 JVM其实就是一个字节码解释器。 1.5 Java程序的结构 使用Java语言可以编写两种类型的程序:Application(应用程序)和Applet(小程序)。 但从JDK 9开始不推荐使用Java的Applet功能。从JDK 11开始Java对Applet的支持被 删除,完全淘汰了Applet。但Java中添加了一个Applet的替代器,称为Java Web Start, 它支持从Web页面动态下载应用程序功能。它是一种部署机制,对于不适合Applet的大 型Java应用程序尤其有用。另外,从JDK 11开始JavaFX不再包含在JDK中,相反,这 个GUI框架已经成为一个独立的开源项目,因为这些特性不再是JDK的一部分。 应用程序是从命令行运行的程序,它可以在Java平台上独立运行,通常称为Java应 用程序。Java应用程序是独立完整的程序,在命令行调用独立的解释器软件即可运行。另 外,Java应用程序的主类包含有一个定义为 public static void main(String[] args)的主方法, 这个方法是Java应用程序的标志,同时也是Java应用程序执行的入口点(或称起始点), 在应用程序中包含有main()方法的类一定是主类,但主类并不一定要求是public类。 一个复杂的应用程序可以由一个或多个Java源文件构成,每个文件中可以有多个类 定义。下面的程序是一个Java应用程序文件。 说明:为了便于对程序代码的解释,本书在每行代码之前加一行号,它们并不是程序代 码的一部分。 1 package ch01; //定义该程序属于ch01包 2 import java.io.*; //导入java.io类库中的所有类 3 public class App1_1{ //定义类:App1_1 4 public static void main(String[] args) { //定义主方法 5 char c= ' '; 6 System.out.print("请输入一个字符:"); 7 try{ 8 c=(char)System.in.read(); 9 } 10 catch(IOException s){} 11 System.out.println("您输入的字符是:"+c); 12 } 13 } 从这个程序可以看出,一般的Java源程序文件由以下三部分组成: zpackage语句(0个或1个); zimport语句(0个或多个); z类定义(1个或多个)。 其中,package语句表示该程序所属的包。它只能有一个或者没有。如果有,则必须 放在最前面。如果没有,则表示本程序属于默认包。 import语句表示引入其他类库中的类,以便使用。import语句可以有0或多个,它必 须放在类定义的前面。 类定义是Java源程序的主要部分,每个文件中可以定义若干类。 Java程序中定义类使用关键字class,每个类的定义由类头定义和类体定义两部分组 成。类体部分用来定义属性和方法这两种类的成员,其中属性则类似于变量,方法类似于 其他高级语言中的函数。类头部分除了声明类名之外,还可以说明类的继承特性,当一个 类被定义为另一个已经存在的类(称为父类)的子类时,它就可以从其父类中继承一些已 定义好的成员而不必自己重复编码。 类体中属性也称为域,包括常量、变量、对象、数组等独立的实体;类中的方法类似 于函数的代码单元块。这两个组成成分通称为类的成员。在上面的例子中,App1_1类中 只有一个成员,即第4~12行定义的方法main()。用来标志方法头的是方法名后面的一 程序设计基础 第8版 对小括号,小括号里面是该方法使用的形式参数,方法名前面的public是用来说明这个方 法属性的修饰符,其具体语法规定将在第6章中介绍。方法体部分由若干以分号“;”结 尾的语句组成,并由一对花括号“{}”括起来,在方法体内部不能再定义其他方法。 同其他高级语言一样,语句是构成Java程序的基本单位之一。每条Java语句都以分 号“;”结束,其构成必须符合Java语言的语法规则。类和方法中的所有语句应该用一对 花括号括起来。即除package及import语句之外,其他执行具体操作的语句都只能存在于 类的花括号之中。 比语句更小的语言单位是常量、变量、关键字和表达式等,Java的语句就是由它们构 成的。其中,声明常量与变量的关键字是Java语言语法规定的保留字,用户程序定义的 常量和变量的取名不能与保留字相同。 Java源程序的书写格式比较自由,如语句之间可以换行,也可以不换行,但养成一 种良好的书写习惯比较重要。 注意:Java是严格区分字母大小写的语言。书写时,大小写不能混淆。 一个应用程序中可以有多个类,但只能有一个类是主类。在Java应用程序中,这个 主类是指包含main()方法的类,主类是Java程序执行的入口点。 本章小结 1. Java程序比较特殊,它必须先经过编译的过程,然后再利用解释的方式来执行。即 首先要将源程序(.java文件)通过编译器将其转换为与平台无关的字节码(.class文件), 然后再通过解释器来解释执行字节码。 2.字节码(byte-codes)最大的好处是可跨平台执行,可让程序“编写一次,到处运 行”(write once,run anywhere)的梦想成真。 3. Java Application称为Java应用程序。Java 应用程序是指可以在Java平台上独立运 行的一种程序。 4.每个应用程序都必须有一个主类,主类是程序执行的起始点,应用程序的主类是 包含有main()方法的类,但应用程序的主类并不一定要求是public类。 习题1 1.1 Java语言有哪些特点? 1.2 什么是字节码?采用字节码的最大好处是什么? 1.3 什么是Java虚拟机? 1.4 什么是平台无关性?Java语言是怎样实现平台无关性的? 1.5 Java应用程序的结构包含哪几方面? 1.6 什么是Java应用程序的主类?应用程序的主类有何要求?