Java2入门经典

 

 

(注:此贴停止更新,原资料丢失)

 

 

Java2入门经典

Beginning Java2

IVOR HORTON著

叶乃文 邝劲筠 叶以农 等译

中国电力出版社

内容提要

本书是一本集综合性、实用性为一体的学习Java语言和Java2平台API的优秀教材,在世界范围内广受欢迎,口碑极佳。书中除讲解Java程序设计语言外,还广泛介绍了作为一名Java程序设计人员应该掌握的必要知识,并提供了大量的实用性很强的编程实例。

本书适合作为学习Java的教材使用,也可供Java爱好者参考

图书在版编目(CIP)数据

Java2 入门经典/(美)霍顿著;叶乃文等译。-北京:中国电力出版社。2001

ISBN 7-5083-0477-2

译者序

Java自发布以来,作为一种面向对象的程序设计语言深受广大计算机同仁的青睐。Java2平台作为一个支持应用程序开发的环境已日趋成熟。我们热诚地向你推荐这本《Java2入门经典》。这是一本集综合性、实用性为一体的学习Java语言和Java2平台API的指导手册。在全世界范围内都受到了广泛欢迎,是一本口碑极佳的优秀Java教材。该书中除讲解Java程序设计语言外,还广泛介绍了一些作为一名Java程序设计人员应该掌握的必要知识,并提供了大量的实用性编程技能,相信这些会对你应用JDK编程有很大的帮助。

参加本书翻译的有叶以农(1-6章)、包彤(第7、15、16章)、王燕兴(第8、9章)、王众(第10、11章)、叶乃文(第12~14章)、邝劲筠(第17-19章)等;全书由邝劲筠、叶乃文两位同志统稿。

书中文字与内容力求忠实原著,但限于译者水平,加上时间仓促,翻译过程中难免有疏漏之处,敬请广大读者批评指正。

2001年8月

原作者序

我的“入门经典”系列都致力于帮助程序设计人员克服所面临的三个主要问题:如何掌握程序设计语言及其应用环境的术语;如何理解语言元素的使用;如何体会语言在实际环境中的应用。

对于 有能力的业余爱好者以及经验丰富的专业人士来说,术语是它们之间交流的重要工具,实际上也是必不可少的。我的初衷是确保初学者理解术语的含义,并乐于使用它们,使之能更有效地使用大多数程序设计软件,并能够阅读大多数程序设计语言的书籍。

毫无疑问,理解语言成分的句法及作用是学习语言的基础。但是,我认为用例子来说明语言成分的工作状态,以及它们的使用情况也同样很重要。在本书中,我不仅给出代码段,而且还尽可能地给读者提供实际运行的例子,来展示和说明解决问题的各语言成分之间的联系。读者可以以此为基础。用各种方式来修改代码并查看实际运行效果。

实际上,仅仅具备单独使用语言成分的技巧是不够的。为了帮助初学者获得开发应用程序的能力,我努力使它们对语言成分的工作情况有一个透彻的了解,并为此提供了大量综合的运行例子。这就是为什么在每一章中至少提供一个运行例子的原因。这样一来,就有可能讲清处理代码以及将语言成分组合起来的方法。

最后要讲的是,我知道看一遍入门书所得甚少。因此,对于初学者来说,我力图使本书具有三个优势(对于大多数程序设计语言都是这样的):第一,篇幅较大,这意味着读者在学成之后会更加满意;第二,生动有趣,使读者把学习作为一种享受;第三,比想像的容易,读者一定能很好地掌握书中的内容。

Ivor Horton

前言

欢迎

    欢迎阅读本书。这是一本集综合性、实用性为一体的学习Java语言和Java2平台API的指导手册。本书提供了大量实用的编程技能,这对于提高Java编程水平会有很大帮助。

    在本书中,除了讲解Java语言外,我们还对Java程序员应该掌握的相关知识做了广泛地介绍。本书章节的设置经过精心设计,具有很强的逻辑性。每一步老师在前面学习的基础上,秩序渐进地提高,这样安排会使你学习Java程序设计变得更加容易、更加有效。

本书的使用对象

    Java程序设计是一个庞大的,发展迅速的领域。自从java发布以来,作为一种面向对象的程序设计语言,不论在Internet程序设计中,还是在程序设计的教学中,都呈现出显著的优势。Java2平台对于支持应用程序的开发来说,是一个具有重要影响的成熟软件。实际上,Java本身并不复杂,只是内容稍多了一些。使用它进行软件开发会更快,更好。

在本书中,我们力求让你对Java语言有个全面的了解,并适当体验该语言环境的应用,最终使你对每个核心内容有一个清楚的认识。在对本书内容深入理解之后,你就可以编写功能强大、高效的Java程序了。

本书书名中“入门(Beginning)”这个词,更多的是指本书的教学方式而不是你的技能水平。把它称之为“直接进入Java”可能更贴切,因为它的教学结构就是按此设计的,也就是说,不管你是一名受过其他语言训练的程序员,还是一名程序设计的新手,本书都会将你直接领入Java世界。

我们假设,你已经具有程序设计方面的一些基础知识,至少你懂得程序运行的一些基本概念。即使你没有丰富的程序设计经验,也能够成功地学习本书。本书内容进展得很快,但是决不遗漏Java运行过程的必要解释。

本书包含的内容

本书将按照下述结构讲解Java程序设计:

第一步,讲述Java程序设计中的主要术语和概念。没有这些概念,我们将无从入手。

第二步,提供有关Java语言特性的详细说明,包括:基本数据类型、用于操纵数据的控制结构,该语言中面向对象的特征、运行期间错误的处理方法和线程的使用方式。本书不但详细地阐述了语言元素的作用,而且还提供了它们在实际中的应用方法。

第三步,展开介绍Java类库中的关键包,其中包括:io、util、awt、awt.event、applet、sql和java.swing包,并且举例说明。

第四步,通过指导你建立一个实际的应用程序Sketcher,使你在一个逼真的环境中应用Java语言的功能以及Java的类库。Sketcher应用程序拥有菜单、工具条、状态控制面板,并且还具有绘制图形、管理多个图元、处理文字、打印并保存的功能。这些会使你对如何在实际项目中应用Java有更加深刻的理解,其中有一些内容很难从一般的例子中发现其高超之处。

最后,说明如何使用SDK的各种工具。

学习这些内容时,我们将同时介绍相关的理论,并且用适当的例子以及清晰明了的说明来对它们进行解释。第一遍阅读时,可速度稍快些。必要时,可以返回来仔细地复习那些需要的部分。在每章中我们都设计了一个小例子,主要用来说明一个类和它的方法,或者一些新理论的运用。这些将着重展示Java语言的特性或者方法的应用过程。

我们建议你实践一下读到的例子,以便从中获取更多的技能。即使下载了例子的源代码,你也最好亲自录入一遍,其效果大不一样。这些例子只是为你提供了一个练习的基础,我们真诚地鼓励你建立自己的程序。试一试是很重要的,你会从失败中学习到很多东西,就像你从最初的工作中吸取经验一样。

本书的所有例子程序的源代码可从http://www.wrox.com中获取

学习本书,你还需要什么工具

本书的代码已经过测试,对绝大数章节来说,其他硬件和软件的需求很有限,一个文本编辑器和一个运行Java工具的命令行窗口。在附录A中提供了本书的需求细节,以及如何获取并安装它们。

约定

为了帮助你从文本中获取更多信息、跟踪处理过程,在本书中我们使用了若干约定。
例如,在讨论代码时,我们有两条约定:
问题的背景知识斜体表示。而方框内显示重要,不可遗忘的与上下文相关的信息。

在介绍它们时,我们突出显示重要的词语。如术语第一次出现的时候。命令行及终端输出表示形式为:


C:\>java ShowStyle
When the command line is shown,

Java的方法和结构定义用定义框表示。例如:

if(life == aimless){
    DoSomething; // Italics show that words should be replaced
        DomSomethingElse;//With something more meaningful
}

最后,在代码例子中,背景为浅灰色的代码显示新的,重要的、相关的代码。

而背景为白色的代码显示当前上下文中不重要或者在以前已看过的代码。

我们将用“试试看”展示例子代码,它包含了分享出来的具有帮助性的代码部分、加重显示的组件部分以及应用程序的改进部分。对于重要的代码,我们还在后面的“如何工作”部分中说明它与前面理论部分的重要联系。我们这两条约定能够帮助你驱走难以对付的代码清单,换来好吃合口的美味佳肴。

告诉我们你的想法

我们尽量做到使你满意,所以十分希望能听到你的感受,特别是你还需要什么,还想知道什么,以及对我们为你提供的这些知识是否感到满意。我们收到的有关本书第一稿的反馈意见对我们的修订工作有很大帮助,使它得到了很大程序的完善。

行无关。在任何其他的程序设计语言中,应用程序将需要为每台不同系统的计算机特殊编制源代码,以适应特定机器和操作系统的特性。

Java的另一个主要特性可能就是面向对象(Object oriented)。用面向对象的方法进行程序设计是所有Java程序的一个隐含特性。在本章的稍后部分,我们将会看到它的含义。Java不仅面向对象,而且还设法避免其他面向对象语言中继承的难度和复杂度,因此你将会发现Java是一个非常简单,容易学习的语言。

1.2 学习Java

Java并不难,只是包含内容比较多。语言本身相当精练,但功能非常强大。为了能够更加有效地使用Java编制程序,你需要学习该语言所包含的库,其中的内容十分丰富。在本书中,你将依次了解语言如何运行以及如何应用它。学习这些内容的顺序经过精心地安排,通过一些简单明了的过程,你就可以获得一定的专业知识,建立运用Java进行程序设计的信心。每一章都尽量避免使用你还没有学习的东西。这样一来,你不能马上编写嵌入Web网页的Java程序,但是这确实是一种诱人想法,有点像冒险跳入深水学习游泳。一般说来,比较好的做法是在学习游泳之前,先在浅水池中学习如何漂浮,这样溺水的可能性就被降到最低程度,很可能最后你还会成为一名优秀的游泳运动员。

Java程序

正像我们已经提到的,你可以用Java编写两种类型的程序。嵌入Web网页的程序被称作Java小应用程序(applet),一般单独运行的程序称作应用程序(application)。你还可以进一步将Java应用程序细分为控制台应用程序(console application),即只能够将字符输出到计算机屏幕上(例如,在PC机的Windows下的DOS窗口中),还有窗口化的Java应用程序(Windowed Java application),即可以建立、管理多个窗口,并且使用典型的基于窗口程序的图形用户界面(GUI)的技术。

 

在学习Java语言基础阶段,我们将使用控制台应用程序作为例子来说明其运行过程。这是因为我们可以将注意力集中在语言的特征上,而不用担心那些建立、管理窗口遇到的复杂问题。一旦你熟练掌握了Java语言的所有特点,就可以转到窗口化的应用程序和小应用程序上。

 

学习Java前面的路

在学习之前,仔细考虑一下从哪儿开始,以及选择什么样的学习路线,非常有益,所以让我们先来看看学习Java的主要路线图。在使用本书学习Java时,你将经过五个阶段逐步提高。

1.第一阶段是本章。开始介绍一些有关Java程序结构的基本概念及Java程序运行方式。其中包括面向对象程序设计的有关概念;如何将一个Java源文件建成一个可执行程序等等内容。在一开始就接触这些概念,会使你感到学习编写Java程序是一件很容易的事情。

2.第二阶段,你将学习如何将语句组织在一起,在程序中如何存储基本数据,如何进行计算以及如何根据结果作出判断。这些都是你进一步学习所需要解决的难题。

3.第三阶段,你将学习有关类的知识,即如何定义一个类,如何应用类。这些是你需要掌握的Java语言的面向对象特性。到此为止,你已经学习了所有关于Java语言运行的基本知识,具备了进一步深入学习如何应用它们的基础。

4.第四阶段,你将学习如何将一个应用程序分成可并发执行的程序段。当你在一个Web网页中包括几个小应用程序,并且一个小应用程序的开始执行并不需要等待另一个小应用程序结束时,这一点显得尤为重要。例如,在你玩一个游戏时,可以让置于同一个Web网页中的另一个有趣的动画片同时演播。

5.第五阶段,你将更加详细地学习如何实现一个应用程序,或者一个带有图形用户界面的小应用程序,以及如何处理在此环境中的用户交互,这将应用Java类库所提供的能力。与学习GUI工具一样,你也将学习用不同的方法来处理图像和使用Java的数据库访问工具。完成这个阶段的学习,你就具备了自己编写成熟的应用程序和小应用程序的能力。本书结束后,你应该是一名知识丰富的Java程序员,欠缺的只是经验。

纵贯全书,我们将以完整的例子来提示Java的工作过程。你应该建立并且运行所有这些实例,即使是最简单的,也最好由你亲自录入,不要害怕实验。对于不是很清楚 的所有内容,你都应该变换一个例子来分析它的运行过程,最好你自己编写一个例子。假如你对已经学习过的Java某些方面的内容还不是很明确,请不要马上在书中查找,先试试看,能够发现错误是学习的一个有效途径。

 

1.3 Java环境

你可以在各种类型的计算机上使用各种操作系统运行Java程序。Java程序在PC机的Windows 9598/NT上运行,它运行在一个标准的被称为Java虚拟机(Java virtual machine)的假想计算机中,这种虚拟机是在你的计算机中用程序仿真,如下图所示。

你编写的Java源代码被Java编译器转换为由字节码(byte codes)组成的二进制程序。字节码是Java虚拟机的机器指令。在你执行Java程序时,一个称为Java的解释器可以单独地运行,也可以作为Web浏览器的一部分运行。比如Netscape Navigator或者Microsoft Internet Explorer,都可以自动地调用并执行包含在Web网页中的小应用程序。

因为Java程序是由字节码组成,而不是原始的机器指令,所以与运行它的特定硬件完全无关。任何计算机只要实现Java的环境,就可以像其他计算机一样运行Java程序。由于Java解释器位于程序和物理机器之间,它可以阻止执行那些在程序中未经认可的操作。

在过去,所有这些灵活性和保护作用的获得都伴随着性能的损失,这主要反映在执行速度上。一个被解释的Java程序的运行速度仅是使用内部机器指令的相应程序的十分之一。例如,对于那些主要不是用于计算的程序(包含在Web网页中的程序就属于这类程序),你不必很注重速度问题。如果你碰巧有一个支持程序实时编译(“Just In Time” compilation)的Java环境,就不必担心这些性能的损失。当它们被加载时,快速编译器可以把你的Java程序转换为内部的机器指令。程序的加载时间会稍长一些,但加载成功后,就会以最高的速度运行。

 

 

 

 

Java程序开发

有很多优秀的Java程序开发环境,包括Sun、Borland、Symantec的产品。它们都提供了非常友好的环境来建立、编辑源代码,编译和调试源程序。价格最低的Java程序开发包无疑是免费获得的Sun公司的Java开发工具(JDK),但使用起来并不很方便。对于不同的硬件平台和操作系统,你可以从公司Sun Java站点的http://java.sun.com网址中下载。

即使你正在使用这种或者那种交互式的开发环境,我也建议你安装JDK,它为你提供了一个优秀的引用环境来检查可能出现的问题。使用Java产品提供的Java版本并不一定是最新的,所以如果你在一个商业化的Java开发系统下运行书中的例子出现了问题,就应该用JDK试试看。这个环境会使程序很好地运行。

运行一个Java应用程序

 

 

-------------------------第五页缺失,待补-------------------------------



</HEAD>
<BODY>
需要的文字。文档主体可以包含各种HTML元素,包括<B>Java小应用程序</B>。注意每个元素都用一对标记来标识。本书下文中Java小应用程序将用粗体显示。
</BODY>
</HTML>

在<HTML>中出现了两个元素,一个是<HEAD>元素,另一个是<BODY>元素。<HEAD>元素提供有关文档的信息。从严格意义上讲,它并不是<HTML>元素的一部分。<HEAD>元素内出现的由两个<TITLE>标记所包含的文字,在浏览网页时,将显示在窗口的标题上。

出现在<BODY>元素内的其他标记可以包含标题、列表、表格、到其他网页的链接以及Java小应用程序。因为有些元素被认为是空的,所以不要求结尾标记。这种类型的元素标记有<HR>,它指出一条占据该网页总宽度的水平线段。你可以使用<HR>标记分页,也可以用它来隔离不同类型的元素。我在前面提到过,你会在本书中找到一个HTML标记的综合列表。

 

将一个小应用程序添加到HTML文件中

对于许多元素标记而言,你可以在标记开始后说明元素的属性,用来定义有关该元素附加或限定的数据。Java小应用程序是以<APPLET>标记识别的。这里是一个在HTML文件中包含Java小应用程序的例子:

<HTML>
<HEAD>
<TITLE>A Simple Program</TITLE>
</HEAD>
<BODY>
<HR>
<APPLET code="MyFirstApplet.class" width = 300 height = 200></APPLET>
<HR>
</BODY>
</HTML>

标记之间的两个阴影行标明小应用程序的字节码包含在MyFirstApplet.class文件中。<APPLET>标记中的属性值code说明了包含小应用程序字节码的文件名。另两个属性值width和height定义了小应用程序执行时占据屏幕区域的宽度和高度。这些属性是执行小应用程序必须定义的。正像我们将要看到的,有很多标记可以有选择地指定。这里是一个简单的小应用程序的Java源代码:

import java.awt.Graphics;

import javax.swing.JApplet;

public class MyFirstApplet extends JApplet{
	public void paint(Graphics g){
		g.drawString("To climb a ladder,start at the bottom rung", 20, 90);
	}
}
 



注意:Java对于大小写敏感。你不能用一个大写字母P来输入public,否则该程序将不会编译。若运行该小应用程序,将会显示一条信息。如何显示信息并不是所要介绍的,我们只关心一个小应用程序如何被嵌入到HTML网页中。如果你将这段代码进行编译,并作为Java小应用程序代码存储在与前面说明的HTML网页文件MyFirstApplet.html同一目录下,你就可以利用JDK中的appletview运行这段小应用程序。其命令为:

appletviewer MyFirstApplet.html

其结果将显示如下所示的窗口内容:

 

 

这是产生于Windows XP下的窗口。在其他操作系统下,可能略有不同。这是因为Java将服从运行平台的风格。由于小应用程序窗口的高度和宽度是以像素为单位说明的,所以窗口的物理大小将取决于显示器的分辨率和尺寸。

 

在任何浏览器中运行小应用程序

HTML3.2中介绍的APPLET标记在HTML4.0中已被OBJECT标记取代。然而,现在

Internet Explorer还支持这个标记,而Netscape Navigator则使用EMBED标记。

为了使内容更加有趣,你不能指望客户端浏览器拥有最新型的虚拟机,所以与上

述代码等价的使用OBJECT标记的代码是:

<OBJECT WIDTH =300 HEIGHT = 200>
<PARAM NAME=CODE VALUE= MyFirstApplet.class>
<PARAM NAME=TYPE VALUE= 'application/x-java-applet;version=1.2'>
</OBJECT>

这段代码不能在Internet Explorer 4上运行,除非它有能找到JApplet类的虚拟

机。

JavaSoft发布了一个Java插件产品,它能够把最新型的虚拟机插入Web网页浏览

器中。使用该产品,可以确保小应用程序在客户端得到运行,即使在支持旧版本

的Java浏览器中也是如此。为了使用插件技术制作一个一个Netscape和Internet

Explorer都能使用的HTML网页,你可以使用下列代码:

<OBJECT CLASSID='clsid:8AD9C840-044E-11D1-B3E9-00805F499D93' WIDTH

=300 HEIGHT = 200

CODEBASE=http://java.sun.com/products/plugin/1.2/jinstall-12-

win32.cab#Version=1.2,0,0>
<PARAM NAME=CODE VALUE=MyFirstApplet.class>
<PARAM NAME=TYPE VALUE= 'application/x-java-applet;version=1.2'>

<COMMENT>
<EMBED TYPE='application/x-java-applet;version=1.2' CODE=

MyFirstApplet.class WIDTH =300 HEIGHT = 200 PLUGINSPACE =

'http://java.sun.com/products/plugin/1.2/plugin-install.html'>
<NOEMBED></COMMENT>
ALT = "Your browser understands the &lt;APPLET&gt;tag but isn't

running the applet,for some reason."
Your browser is completely ignoring the &lt;APPLET&gt;tag!
</NOEMBED></EMBED>
</OBJECT>

在这里,OBJECT标记有CLASSID和CODEBASE属性,用来放置Windows平台的Java插

件。在Internet Explorer中,COMMENT标记允许EMBED标记在浏览器中被隐藏起

来。而Netscape Navigator将读取它,并且从JavaSoft获得一个与之匹配的Java

插件。

使用JDK类编制在所有浏览器中运行的Java小应用程序的细节,可以在网址

http://java.sun.com/products/plugin/中找到。

Appletview不支持这三个标记。在本书的剩余部分,我们将根据需要使用APPLET

标记。正像你希望看到的,原来在APPLET标记中的代码,可以被大批地剪切并粘

贴到上面清单的OBJECT的EMBED标记内。

 

1.4 Java中面向对象的程序设计

正像本章开始所说的,Java是一个面向对象的程序设计语言。在使用非面向对象的程序设计语言时,你必须用数值、字符,即语言中可以处理的基本数据类型,来求解各种问题。而在像Java这样的面向对象语言中,情况就截然不同了。当然,你还是要对数值与字符进行操作,它们被称为基本数据类型(basic data types),但你也可以定义与特定问题相关的其他实体类型。你将依据与问题相关的实体或对象解决问题。这不但影响一个程序的结构,而且解决问题所表达的术语也不尽相同。如果你的程序涉及到棒球运动员,Java程序中就可能需要包括一个BaseballPlayer对象;如果你编制一个程序涉及California的水果产品,就有可能需要包含Oranges对象。实际上,除了外在感觉外,面向对象的程序通常比较容易理解。

在Java语言中,几乎所有事物都是对象。如果你以前没有学习过面向对象的程序设计,可能会感到一丝恐惧。请不要害怕,Java中的对象非常简单。事实上,我们马上就要开始了解在Java对象背后的一些概念。这样一来,从一开始你就站在了正确的跑道上。

这并不意味着我们马上就陷入用Java描述和使用对象的细节,在此我们只给出概念。我们从在Java代码中使用奇数位这一基础开始学习,逐步帮助我们理清概念。对于这里的所有代码,我们将在后续章节中讲解。首先,我们集中理解清楚对象的含义,然后就可以轻松地在实践中将它分析、研究透彻,使之不断深入。

什么是对象?

任何事物都可以被看成对象,对象随处可见。你可以把tree(树)看作是一个特殊的对象类,一般所有的树是一个非常抽象的类,这是由于你很难找到一种能够概括所有树种的树。因此,在我的花园中,橡树,我就叫它myOak;在你的花园中,桉树,你叫它thatDarnedTree;而generalSherman是一种闻名的红木。它们都是树的特例,也就是说,橡树、桉树和红木都是树的子类。注意,在这是我们将引入类(class)这个术语,它是一个描述具有共同特性的对象集合的规格说明(specification)。类是表达规格说明或者模板的程序段,它定义了特定对象的组织方式。子类也是一个类,它继承了父类的所有特性,除此之外又有自己的特殊属性。当然,定义的类要符合你的需求,它并没有绝对的框架。对于一个很小的问题,Tree类的规格说明可能只包含树的种类和高度。如果你是一个树木栽培家,有关树的信息要求得可能更加复杂,可能是一个类集,它包含也很多种树木。

 

 

类的实例(instance)是一个技术术语。它描述了一个已有的对象。Ash是一个对象的规格说明,而yourAsh就是构成该规格说明的一个对象,因此yourAsh就是类Ash的一个实例。一旦你定义了一个类,就可以说明其对象,又称该类的实例。这就产生了一个问题

 

 

 

-------------------------第十页缺失,待补-------------------------------

 

 

 

对象的操作

类与其他语言的复杂数据类型之间,最根本的差异是类定义中包含着更多的信息

。这些信息主要说明你可以用类对象做些什么事情,也就是类对象可能的操作。

这将取决于对象类型、包含的属性以及你打算如何使用这些类对象。

举一个很简单的例子,假如你的对象是一个一个Integer类型数值,它被计划实

施普通的算术运算:加、减、除,大概你还可以提出来一些其他运算。有些操作

可能毫无意义,比如计算计算Integer的范围、压缩Integer或者扩展扩展

Integer,而这些操作对于非整型的其他类来讲,可能是有意义的。

回到前面的CowboyHat类,你可能想设计两个分别为putHatOn(戴帽)和

takeHatOff(摘帽)的操作,从它们的名字就可以知道它们的含义,以及对

CowboyHat对象的意义。然而,只有当CowboyHat对象有一个记录帽子是否被戴在

头上的属性时,这些操作才有意义。对一个给定的CowboyHat对象,这个操作可

以设定该对象的属性值。当决定CowboyHat是否被戴在头上时,就要查看这个属

性值了。可以想像,你还可以有一个ChangeOwner操作,其功能是把记录目前帽

子拥有者名字的实例变量设定一个新值。示意图中显示了对CowboyHat对象应用

的连续两个操作。

你可能想知道定义的类应如何操作。如同我们稍后将看到的,简称为方法

(method)的自包含程序代码块用给定的名称进行标识。你可以将整型数、浮点

数、字符串或类对象传递给方法,方法也可以返回一个数据项。在对象上执行一

个操作等于执行这个对象定义的方法。

当然,只有一个特定类的实例才可以执行这个类定义的操作,类的实用性与适应

性将取决于你所给出的定义,我们将在第5章中更详细地探讨这些问题。

让我们看一个完整的类定义例子。我们刚刚讲过的CowboyHat类的代码如下所示


这段代码被保存在名字为Cowboyhat.java的文件中,文件的名称总与类的名称相

同,由于这个文件包含源代码,所以文件的扩展名为.java。

 

 

 

类定义的代码显示在类标识后面的大括号内,如图所示。类中所有方法的代码均出现在大括号内。这个类有4个实例变量:owner、type、size和hatOn,最后这个变量永远被初始化为false。按照这个类说明所建立的每个对象,都存储其实例变量的独立拷贝,因此每个对象的实例变量可以有惟一的值。

关键字private被应用于每个实例变量,以确保只有类中的方法才可以直接地访问或更改它们。类方法也可以说明为private。其主要功能是可以防止类以外的一些成员的访问,以保护类内部被错误更改或使用。在其他程序中,若使用了你定义的类,只能访问你想让它们访问的内容。这意味着你可以更改类内部priate方法的操作方式,而不会影响使用它的其他程序。这个类还有5个方法,你可以对CowboyHat对象做5项不同的操作。其中一个被称作构造函数(constructor)的特殊方法用来建立CowboyHat对象,构造函数的名称与类名相同。跟在构造函数后面括号内的参数,指定该函数执行时,传递给该方法的数据。

在练习中,你可能需要为类再定义一些有用的方法,比如,你可能想对两个CowboyHat对象进行比较,看看哪顶帽子大。在此,你只需要有一个 这些代码大致的概念即可,在这里不加赘述。第5章中我们将返回来讨论这些内容。

 

 

Java程序语句

正像你在CowboyHat类的例子中所看到的,类中每个方法均显示在大括号内,它由程序语句(program statement)组成,每条程序语句以分号结束。在Java中,一条语句如果需要的话可以延伸数行,这是因此每条语句以分号(;)作为结束标志,而不是行尾。这里是一条Java程序语句:

 

hatOn = false;

 如果你愿意的话,也可以把它写成:

 

 

hatOn = 

       false;

通常情况下,可以在语句中包含空格和制表符,并通过用多行表示一条语句来增

强程序的可读性,但也存在着一些明显的限制。比如,不能在名称中间插入空格

。如果写成hat on,编译器会将它识别为两个单词。

封装

在这里我们要介绍另一个术语:封装(encapsulation)。封装是指对象中隐蔽

的数据项和方法,它们在类定义中被说明为private。在CowboyHat类中,实例变

量owner、type、size和hatOn都被封装也起来。它们只能通过类定义中的方法来

访问。用这种方法封装类中的成员,对于类对象的安全性和完整性都是非常重要

的。你可能有一个拥有数据成员的类,这些数据成员包含的数值有一些特定的要

求,通过隐蔽这些数据成员并强迫使用方法来设置或者改变它们,就可以确保其

内容设置的合理性。

前面提到的封装另一个优点就是隐蔽类的实现功能。允许有限地访问类中的成员

,使得你可以不修改使用该类的应用程序,而随意地改变类的内部实现。只要方

法的接口不发生变化,内部的代码就可以按你的意愿任意的改变。

一个特定的对象,实例CowboyHat由封闭的实例变量owner、type、size和表示帽

子状态的hatOn组成。只有构造函数、putHatOn()方法、takeHatOff()方法和

getSize()方法可以由外部访问。

在任何位置引用方法,都要在方法名后添加一对括号以区别其他命名的内容,程

序中的方法在定义和使用时总含有括号,正像我们看到的,在文本中以这种方式

描述它都有意义。

类与数据类型

程序设计会涉及对声明的各种类型数据进行处理、传递、操纵、转换。因为类定

义的是程序将要操作的对象类型,所以你可以认为定义类和定义数据类型是相同

的。也就是说,Hat是一种数据类型,Tree也是一种数据类型,实际上你定义的

任何其他类都是数据类型。Java本身还有一个标准类库,它为你提供了广泛的编

程工具与设备。很大程度上,Java程序的工作都是处理、发送、操作或者转换类

对象。在Java中,有一些基本数据类型不属于类,我们将在下一章进行深入地探

讨。但它们主要用于99或者3.75这样的数值,“A”或者“?”这样的单个字符

,还有只有true、false两个值的逻辑型数据类型。Java也有对应于基本类型的

类,其原因我们将在后面阐述。在Java程序中,任何实体都是类对象,不是自己

定义的类,就是Java环境提供给你的类或者从其他地方获得的类,如从一个特定

的支持包中获得的类。

类与子类

在一个类中,你可以将定义的对象划分为更加具体的子集,每个子集也用类来描

述,并且Java给你提供了一种功能,可以定义一个类的特殊类,这就更加自然地

反映了现实状况。就好像可以有很多种方法来划分蛋糕或者森林一样。例如,

Conifer可以是类Tree的一个子类。Conifer类具有Tree类的所有实例变量和方法

,此外还有一些属于Conifer类的基类。当你从一个类比如Tree出发,定义另一

个类比如Conifer时,Conifer类就被认为是由Tree类派生的,并且继承了Tree类

的所有属性。

使用对象的益处

正如我们开始所说的,在面向对象的程序设计中,使用对象描述要求解的问题。

例如,弹球器模拟机可以定义和使用Table、Ball、Flipper和Bumper这几种类对

象。这样设计具有很大的益处,不但利于开发,而且利于程序的扩展。Java提供

了大量的标准类库来帮助你开发应用程序,并且你还可以开发自己的通用类,为

日后的开发奠定一个良好的基础。

因为对象封装了可以运行的方法和定义该类的数据,所以用对象进行程序设计不

易出错。面向对象的Java程序,应该比相应的面向过程式的语言程序更加完善。

面向对象的程序比非对象的程序设计所花费的时间稍长一些,这是因为你必须仔

细地考虑设计的类,但是编写和检测代码所需的时间实际上往往比面向过程式的

程序要少。面向对象的程序比较容易维护、扩展。

1.5 Java程序结构

程序结构的必要元素如下:

一个Java程序包含一系列的类。

每个程序中至少有一个类,也可以有多个类。

每个程序的程序代码存放在一个单独的文件中,其文件名必须与内部定义的类名

相同。

Java源文件必须使用扩展名.java。比如类Hat的文件名为Hat.java,

BaseballPlayer类的文件名为BaseballPlayer.java。

由几个文件组成的一个典型程序如下所示。

很显然,这个程序主要是针对服装的,5个类中有4个类用来描述服饰。每一个源文件都包含一个类定义,组成这个程序的文件被存储在同一个目录中。程序的源文件将包含需要的全部代码,但是这并不意味着所有事物都已包含在程序中。除此之外,还有在前面提到的Java标准类库中引用的代码,所以让我们来看一看Java标准类库的用途。

Java类库

Java中的库是一个类集,其中的类提供了常用的相关功能,它们可以在程序中直接使用。Java类库为你提供了大量引人注目的内容,其中一些主要是为运行你的程序提供服务,另外一些则便于你更加容易地编写程序。标准类库覆盖了很广泛的范围,在这里我们不可能很详尽地进行讨论,在本书中我们只讲述如何应用它提供的功能。

因为类库是一个类集,所以它以一组文件的形式存储,每个文件都包含一个类定义。所有类按相关性被分成若干个组,我们将这些组称为包(package)。每个包都存储在一个独立的目录中,包中的类可以访问同一包中的其他类,而有可能不能访问另一个包中的类。有关这点我们将在第5章中进行详细的论述。

包的名称以这个包所属类的存储路径为基础。例如,包java.lang中的类被存储知目录路径java\lang中(或在Unix的java/lang中)。这个路径与一个特定目录有关,此目录可被执行代码的Java运行环境自动识别。为了在不同的地方重复使用有关的类,你也可以建立包括自定义类的包。

JDK包含的标准包数量不断增长,我最后一次统计的结果大约为60个包。其中有一些包使用得非常频繁,如下表所示。

 

 

我们看一下Java程序是如何工作的。你可以使用最喜欢的文本编辑器来编辑这个程序代码,假如你有附带编辑器的Java开发系统,也可以使用它将这个例子的代码输入进去。输入代码后,使用类名再加上扩展名.java作为文件名,将其保存起来。例如,文件名为OurFirstProgram.java。程序代码如下所示:

 

我们将这个程序命名为OurFirstProgram,它由一个类定义组成。在类定义中只包含一个方法main()。第一行是对方法main的定义,它的格式定义总是如下所示:

public static void main(String[] args)

方法的代码出现在一对大括号内,其内容只有一条可执行语句:

System.out.println("Krakatoa,East of Java??");

这条语句有何功能?让我们从左到右逐项分析一下:

System是一个标准类名,它包括变量和支持从键盘输入和将字符输出到显示器上的方法。因为它包含在java.lang包中,所以它总是可以用简单的类名System来存取。

对象out表示标准的输出流,即你的显示屏幕,它是System类的一个数据成员。这个成员out是System类的一个特殊成员,如同方法main(),在我们的OurFirstProgram类中也是静态的(static)。这意味着即使没有System类型的对象,out也存在于程序中。使用类名System和用句号分开的成员名out组成的名字System.out对成员out进行引用。

语句最右边的内容println("Krakatoa,East of Java??")被称为println()方法,这是一个属于out对象的方法,其功能将括号内的文本串输出到显示器。这说明了一种调用类方法的途径,即对象名后紧跟一个方法名,之间用句点分开。跟 在方法名后面括号中的内容,是执行方法时需要传递给它的信息。例如,在println()中,需要将输出到屏幕上的文本串传递给它。

最后,出现在方法定义中的关键词public、static和void,可被简要地解释为程序代码的注释,但是如果现在你对此还不是很清楚,请不要担心。我们在以后的章节中会详细地进行介绍。

你可以使用JDK编译器对这个程序进行编译,命令为:

javac OurFirstProgram.java

并且只要你编译成功,就可以执行它,其命令为:

java OutFirstProgram

当你运行它时,将显示文本:

Krakatoa,East of Java??

 

1.6 Java和Unicode

 

程序设计如何支持除了拉丁文字符外的任何语言,已成为一个大问题。许多国家

语言定义的是8位字符集,但是如果你要在一个文件中同时使用拉丁文字符集和

西里尔字符集就会产生问题。如果你要处理日文,用8位字符集表示将是不可能

的。Unicode是一个标准字符集,它是为满足所有语言的字符需要而制定的。它

用16位编码表示一个字符,即一个字符占两个字节,从而可以表达多达65535个

不同的字符。这样就可对许多字符进行编码,也就有足够的空间设置每个国家的

字符集编码。其中可以包含日文使用的需要数千个字符编码的Kanji字符集。

我们将在第2章中看到,Java源代码使用的也是Unicode字符集。严格地说,只有

注释、标识符、字符和文本串可以使用Unicode前128个之外的字符。Java内部也

支持Unicode来表示字符和串,所以它潜在地具有理解国际性语言的能力。你熟

悉的ASCII码与Unicode前128个字符是一一对应的,所不同的是每个字符占用两

个字节,你不必在意所要处理的字符编码,当然除非你从一开始就要建立一种支

持多语言的应用程序。

1.7 小结

在本章中,我们介绍了Java的基本特征,以及如何满足在不同计算机之间进行移

植。我们还介绍了面向对象程序设计的元素。

在本章中,我们涵盖的主要内容有:

Java小应用程序的设计目的是嵌入HTML文件中的程序。Java应用程序是独立存在

的程序。Java应用程序可以是支持文本输出屏幕的控制台应用程序,也可以使用

窗口化图形用户界面。

Java程序是面向对象的。

Java源代码以文件的形式存储,其扩展名为.java

Java程序被编译成字节码,它是Java虚拟机的指令。Java虚拟机在所有计算机中

可以同样地运行,这也确保了Java程序的可移植性。

Java对象代码存储在扩展名为.class的文件中。

Java程序由Java解释器执行,解释器将分析字节码并执行其操作。

Java Development Kit(Java开发工具箱)支持Java应用程序和小应用程序的编

译和执行。

1.8 参考资料

假如你对Java的细节有疑问,请参阅我们使用的参考书:

The Java Language Specification,James Gosling et al.,Addison-Wesley.

ISBN 0-201-63451-1,http://java.sun.com/docs/books/jls/html/index.html

The Java Virtual Machine Specification,Tim Lindholm and Frank Yellin,
Addison-Wesley,ISBN 0-201-63452-

X,http://java.sun.com/docs/books/vmspec/html/VMSpecTOC.doc.html

Concurrent Programming in Java--Design Principles and Patterns,Doug

Lea,Addison-Wesley,ISBN 0-201-69581-2

JDBC Database Access with Java, Graham Hamilton et al.,Addison-

Wesley,ISBN 0-201-30995-5

其他感兴趣的网站有:

http://www.wrox.com可以找到本书以及Wrox公司出版的其他Java书信息。

http://java.sun.com/docs/books/tutorial/index.html有Sun公司的Java教程



http://members.pingnet.ch/gamma/JHD-5.1.zip一个由《Design Patterns》作

者之一Erich Gamma开发的用于说明模式的概述框架。

在线的阅读和评论杂志,请查看:

http://www.javalobby.org/

http://www.javaworld.com/javasoft.index.html

http://www.javareport.com/

http://www.sys-con.com/java/index2.html

还有“Java Developer Connection”,可以到http://java.sun.com/jdc订阅。

蛇和梯子

现在我们还有一点时间,让我来给你显示一幅阶段性的框图,展示一下即将进行

的Java学习之旅:

 

 

-------------------------第二十页缺失,待补-------------------------------

 

 

第二章 程序、数据、变量和计算

在本章中,我们介绍Java中数值和字符这些非对象型实体。给出执行数值计算所需要的全部语言元素,并在几个范例中应用它们。

在本章中,你将学习到:

如何声明和定义基本的整型和浮点型变量
如何编写赋值语句
如何计算整型与浮点型混合组成的表达式
什么是强制类型转换以及何时应用它
什么是boolean型变量
在表达式中,什么决定运算符的执行顺序
在程序中如何包含注释

2.1 数据和变量

变量(Variable)是一块取了名字的、用来存储Java程序信息的内存区域,它是一些有意义的数据。在程序中,定义的每块被命名的内存区域都只能存储一种特定类型的数据。如果你定义了一个存储整数的变量,就不能用它来存储0.75这样的数据类型,假如你定义了一个引用Hat对象的变量,就不能用它来引用 一个一个Hat类的对象(或它的任何子类,正像我们在第1章中所介绍的)。因为每个变量能够存储的数据类型是固定的,所以不论什么时候在程序中使用变量,编译器都要对它进行检查,检查是否出现类型不匹配或操作不当的地方。如果程序中有一个处理整数的方法,而你不小心地用它处理了其他类型的数据,比如,一个字符串或一个非整型的数值,编译器就会将它检查出来。

在程序中直接给出的数值被称作直接量(literal)。每个直接量也属于一个特定的类型,假如,25属于整型int。在我们讨论每种变量类型的同时,将同时探讨所应用的各种类型的直接量特性。

使用变量前,你必须用一个声明(declaration)语句说明它的名字和类型。在介绍如何定义变量之前,我们称介绍一下如何选择变量名称。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值