本书从Java语言的基本特点入手, 全面介绍了Java语言的基本概念和编程方法, 并深入介绍了Java的高级特性。内容涉及Java中的基本语法、数据类型、类、异常、界面设计、小应用程序、I/O数据流、线程及网络功能等内容, 基本覆盖了Java的大部分技术, 是进一步使用Java进行技术开发的基础。
《Java程序设计》是Java语言的入门级教材,是作者针对Java语言的教学目的,结合国内教学的特点,根据多年的教学实践与科技开发的经验编写的。结合作者编写的《Java程序设计题解与上机指导》,能帮助读者尽快掌握Java程序设计的方法。
Java语言自问世以来,经历了多次版本升级,从安全机制、语法成分到API函数都有较大的修改。《Java程序设计》自2001年9月由清华大学出版社出版至今,经过了多次修订,目前已经出版了第4版。为配合使用《Java程序设计(第四版)》,我们编写了本书,旨在帮助读者检查Java语言的学习效果,尽快掌握Java语言。
本书对《Java程序设计(第四版)》中13章的全部习题给出了完整的解答。对论述题给出了简单的答案,内容主要摘自《Java程序设计(第四版)》。对编程题给出了对题目的简单分析,论述了设计思路,并给出了相应的程序代码。这些代码均在Java 8.0环境下调试通过,程序运行结果以截图的方式提供给读者,供读者参考。在有些习题的后面,又给出了若干拓展思考题,可帮助读者进一步理解相关的习题。
在《Java程序设计(第四版)》中,增加了一章新内容,即第7章Java语言的高级特性。相应地,本书也增加了一章,对教材中第7章的习题给出了简单解答。在高级特性中介绍了泛型及迭代器,所以对第三版中的程序代码也增加了对泛型及迭代器的使用,对相关程序做了修改及调试。
此外,本书精选了9个实验题目,可供教师配合授课使用。每个实验均列出了实验的目的,以此作为检查的目标。实验后可要求学生完成实验报告,让学生更加深入地理解Java语言,确保学生掌握编程技巧。
众所周知,大部分习题的解答不具有唯一性;特别是程序设计题目,给读者发挥潜能的余地非常大。本书中给出的这些解答和参考答案仅供参考,希望能起到抛砖引玉的作用。因为编者水平的局限性,书中的答案难免存在这样、那样的问题,实现的代码也不一定是最优的。读者可以参考本书中的内容和其他参考书中的内容,得出自己更全面的答案。至于程序代码,其实现的方式就更加多种多样,相信读者能在本书代码的基础之上,编写出功能更全面、效率更高的程序。
计算机技术是不断发展、不断完善的技术,Java语言也是如此。从诞生之日起,它的版本一直在更新中。就在本书编写过程及读者使用本书期间,相信Java又会有新的发展。读者应及时把握这些新动向,了解最新版本的相关信息,特别是及时更新自己机器上的JDK,以保持自己设计的代码与新版本同步。
本书是教学参考书,希望读者在使用、调试本书中代码的同时,既能加深对Java语言的理解,又能提高程序设计的能力,并在此过程中不断发现问题、思考问题、解决问题,把本书作为掌握知识的一个工具和桥梁。
本书由辛运帏、饶一梅编写,并运行通过了所有程序代码。
由于作者水平有限,对Java语言的掌握不够全面,书中难免有不妥之处,恳请广大读者特别是同行专家批评指正,在此我们表示深深的谢意。
编者
于南开园
第3版前言
Java语言自问世以来,经历了多次版本升级,新版本从安全机制、语法成分到API函数都有较大的修改。《Java程序设计》自2001年9月由清华大学出版社出版至今,也经过了多次修订,目前已经出版了第三版。为配合使用《Java程序设计(第三版)》,我们编写了这本《Java程序设计题解与上机指导(第三版)》,旨在帮助读者检查Java语言的学习效果,尽快掌握Java语言。
本书对《Java程序设计(第三版)》一书中12章的全部习题做了完整解答。对论述题给出了简单的答案,内容主要摘自《Java 程序设计(第三版)》。对编程题目给出了题目的简单分析,论述了设计思路,并给出了相应的程序代码。这些代码均在Java 5.0环境下调试通过,程序运行结果以截图的方式提供给读者,供读者参考。在有些习题的后面,又给出了若干拓展思考题,可帮助读者进一步理解相关的知识。此外,本书精选了9个实验题目,可供教师配合授课使用。每个实验均列出了实验的目的,以此作为检查的依据。实验后可要求学生完成实验报告,让学生更加深入理解Java语言,确保学生掌握编程技巧。
众所周知,大部分的习题解答不具有唯一性;特别是程序设计题目,给读者发挥潜能的余地非常大。本书中给出的这些解答和参考答案仅供参考,希望能起到抛砖引玉的作用。因为编者水平的局限性,书中的答案难免存在某些问题,实现的代码也不一定是最优的。读者可以参考本书中的内容和其他参考书中的内容,得出自己更全面的答案。至于程序代码,其实现的方式就更加多种多样,相信读者能在本书代码的基础之上,编写出功能更全面、效率更高的程序。
计算机技术是不断发展、不断完善的技术,Java语言也是如此。从诞生之日起,它的版本一直在更新中。就在本书编写过程及读者使用本书期间,相信Java语言又有了新的发展。读者应及时把握这些新动向,了解最新版本的相关信息,特别是及时更新自己机器上的JDK,以保持自己设计的代码与新版本同步。
本书是一本教学参考书,希望读者在使用、调试本书中代码的同时,既能加深对Java语言的理解,又能提高程序设计的能力,并在此过程中不断发现问题、思考问题、解决问题,把本书作为掌握知识的一个工具和桥梁。
本书由辛运帏、饶一梅编写,并运行通过了书中所有程序代码。
由于作者水平有限,对Java语言的掌握不够全面,书中难免有错误和不妥之处,恳请广大读者特别是同行专家批评指正,在此我们表示深深的谢意。
编者
于南开园
辛运帏,女,博士,教授。现为南开大学计算机与控制工程学院计算机与信息安全系教授。多年来一直从事程序语言设计、数据结构与算法等方向的教学和科研工作,主讲数据结构与算法、形式语言与自动机、计算方法等课程。主要研究领域为人工智能、电子商务、加密技术、智能信息系统等,已出版《Java语言程序设计》、《数据结构》、《离散数学》等相关教材。
第1部分题解
概述3标识符、关键字和数据类型19
表达式和流程控制语句46
数组和字符串73
对象和类的进一步介绍93
Java语言中的异常143
Java语言的高级特性150
Java的图形用户界面设计157
Swing组件174
Java Applet190
Java数据流205
线程243
Java的网络功能252
第2部分上 机 指 导
实验1熟悉系统及环境261
实验2简单的输入/输出处理263
实验3类的练习267
实验4模拟彩票开奖游戏273实验5模拟CD出租销售店281
实验6计算器300
实验7用户界面设计313
实验8多线程练习332
实验9文件读写练习338
第5章对象和类的进一步介绍
5.1详细说明类是如何定义的,解释类的特性及它的几个要素。
解: Java程序设计就是定义类的过程,Java程序中的所有代码都包含在类中。类可以看作是数据的集合及操作这些数据所需的方法的整合。
Java中的类分两种,一种是系统预定义的类,这些类组成Java类库。Java类库是一组由软件供应商编写好的程序模块,完成常用的基本功能和任务,可由程序编写人员直接调用。正是由于有了这些类库,程序员才有了很好的辅助工具,不必将精力浪费在一些简单常见的功能实现上。基本类库提供的这些功能,使得程序员站在了一个较高的起点上,他们可以把主要精力关注在更加复杂的工作上。这些定义好的类根据实现功能的不同,划分成不同的集合,每个集合称为一个包。Sun公司提供的JDK中共有43个大包。
除去系统预定义的类之外,还有一种是用户程序自己定义的类,当然这其中又包括其他程序员定义的类和自己定义的类。这些类都显式或隐式地派生于Java中某个预定义的类。不论是预定义的类,还是程序员自己定义的类,每个类中一般都包含属性和方法。属性即是数据,属性值表明一个对象的状态;方法决定类有哪些可利用的手段,即可通过哪些函数来操作这些数据。
类的具体格式如下: 修饰符 class 类名\[extends 父类名\]{
类型 成员变量1;
类型 成员变量2;
……
修饰符 类型 成员方法1(参数列表){
类型 局部变量;
方法体
}
修饰符 类型 成员方法2(参数列表){
类型 局部变量;
方法体
}
……
}类定义的第一行是类头,关键字class表明这里定义的是一个类。class前的修饰符允许有多个,用来限定所定义的类的使用方式。
类名是用户为该类所起的名字,它应该是一个合法的标识符,并尽量遵从命名约定。
extends是关键字。如果所定义的类是从某一个父类派生而来,那么,父类的名字应写在extends之后。如果不写的话,则隐式表明继承于Object类。Java不允许多重继承,所以如果有父类的话,只能有一个父类。
类头后面的部分称为类体,类体用一对大括号括起来,含有两部分,一部分是数据成员变量,另一部分是成员方法。数据成员变量可以含有多个,这是类的静态属性,表明类的实例目前所处的状态。类的不同实例对应各自不同的属性值,因此有些属性值可用来标识不同的实例。成员变量前面的类型是该变量的类型。成员方法也可以有多个,其前面的类型是方法返回值的类型。方法对应类的行为和操作。方法体是要执行的真正语句。在方法体中还可以定义该方法内使用的局部变量,这些变量只在该方法内有效。
类可以是public的,表明任何对象都可以使用或扩展这个类;也可以是friendly的,表明它可以被同一个包中的对象使用。类还可以是final的,表明它不可以再有子类,与之相对的,使用abstract修饰的类必须要有子类。
5.2给出3个类的定义: class ParentClass {}
class SubClass1 extends ParentClass {}
class SubClass2 extends ParentClass {}并分别定义3个对象:ParentClass a=new ParentClass ();
SubClass1 b=new SubClass1();
SubClass2 c=new SubClass2();若执行下面的语句:a=b;
b=a;
b=(SubClass1)c;会有什么结果?分别从下面的选项中选择正确的答案。
(1) 编译时出错。
(2) 编译时正确,但执行时出错。
(3) 执行时完全正确。
解: 3行类定义分别定义了3个类,一个父类ParentClass及它的两个子类SubClass1和SubClass2。后面的3行则分别为每个类说明了一个实例,其中,a是ParentClass类的实例,b是SubClass1类的实例,c是SubClass2类的实例。由于SubClass1和SubClass2都是派生于ParentClass的子类,所以b和c也同时是ParentClass类的实例。
Java中允许使用对象之父类类型的一个变量指示该对象,称为转换对象(casting)。关于转换对象的使用,遵从对象引用的赋值兼容原则。所谓对象引用的赋值兼容原则是指允许把子类的实例赋给父类的引用,但不允许把父类的实例赋给子类的引用。实际编程时,可以使用instanceof运算符来判明一个引用指向的是哪个类的实例。如果父类的引用指向的是子类实例,就可以转换该引用,恢复对象的全部功能。
本题中,可以进行下面的测试: boolean tagb1=b instanceof ParentClass;
boolean tagc1=c instanceof ParentClass;tagb1和tagc1的值都是true,表明b和c是子类实例的同时,也是父类的实例。反过来,父类的实例不是子类的实例,例如下面的测试: boolean taga2=a instanceof SubClass1;
boolean taga3=a instanceof SubClass2;taga2和taga3的值都是false。b和c是不同子类的实例,所以如下测试: boolean tagb3=b instanceof SubClass2;
boolean tagc2=c instanceof SubClass1;将出现编译错误。下面针对题目中的3条语句分别进行测试。
(1) 执行a=b;时,a指向父类的实例,b指向子类的实例。由于是将子类实例赋给父类实例,因此编译及执行都是正确的。该语句将执行子类中的方法,如果子类中没有重写父类中的方法,则将执行父类中的方法。例如下面的程序中,父类和子类中都定义了value成员和getValue()方法,将子类的实例赋给父类引用后,此时a的值是子类的实例,再执行语句: taga2=a instanceof SubClass1;则taga2的值应为true。在给a分配的内存中既包括子类中value的值,也含有父类中value的值。调用a.getValue()方法时,先在子类中查找这个方法是否存在,如果有,则返回子类中value的值1;若没有,则查找父类中的同名方法,并返回父类中的值0。
……