第1章 Java语言面与向对象的程序设计
习 题
1. Java语言有哪些主要特点? 答:(要点):
1.简单易学 2.面向对象 3.平台无关性 4.安全稳定 5.支持多线程
6.很好地支持网络编程
7.Java丰富的类库使得Java可以广泛地应用
2.简述面向过程问题求解和面向对象问题求解的异同。试列举出面向对象和面向过程的编程语言各两种。
答:面向过程问题求解,以具体的解题过程为研究和实现的主体,其思维特点更接近于计算机;面向对象的问题求解,则是以“对象”为主体,“对象”是现实世界的实体或概念在计算机逻辑中的抽象表示,更接近于人的思维特点。
面向过程的编程语言:C,Pascal, Foratn。 面向对象的编程语言:C++, Java,C#。
3.简述对象、类和实体及它们之间的相互关系。尝试从日常接触到的人或物中抽象出对象的概念。
答:面向对象技术中的对象就是现实世界中某个具体的物理实体在计算机逻辑中的映射和体现。
类是同种对象的集合与抽象。类是一种抽象的数据类型,它是所有具有一定共性的对象的抽象,而属于类的某一个对象则被称为是类的一个实例,是类的一次实例化的结果。如果类是抽象的概念,如“电视机”,那么对象就是某一个具体的电视机,如“我家那台电视机”。
4.对象有哪些属性?什么是状态?什么是行为?二者之间有何关系?设有对象“学生”,试为这个对象设计状态与行为。
答:对象都具有状态和行为。
对象的状态又称为对象的静态属性,主要指对象内部所包含的各种信息,也就是变量。每个对象个体都具有自己专有的内部变量,这些变量的值标明了对象所处的状态。
行为又称为对象的操作,它主要表述对象的动态属性,操作的作用是设置或改变对象的状态。
学生的状态:姓名、性别、年龄、所在学校、所在系别、通讯地址、电话号码、入学成绩等;
学生的行为:自我介绍、入学注册、选课、参加比赛等。
1-1
5.对象间有哪三种关系?对象“班级”与对象“学生”是什么关系?对象“学生”与对象“大学生”是什么关系?
答:对象间可能存在的关系有三种:包含、继承和关联。 对象“班级”与对象“学生”是包含关系。 对象“学生”与对象“大学生”是继承关系。
6.有人说“父母”和“子女”之间是继承的关系。这种说法是否正确?为什么? 答:“父母”和“子女”之间不是面向对象意义上的“继承”关系。因为这里的继承关系是“is a”的关系,“男人”与“人”之间可以说是继承关系。
7.面向对象的软件开发包括哪些过程?OOA模型包括哪三个层次?OOD模型在OOA模型的基础上引入了哪些工作?
答:面向对象的软件开发过程可以大体划分为面向对象的分析(Object Oriented analysis,OOA)、面向对象的设计(Object oriented design,OOD)、面向对象的实现(Object oriented programming,OOP)三个阶段。
面向对象的分析的主要作用是明确用户的需求,并用标准化的面向对象的模型规范地表述这一需求,最后将形成面向对象的分析模型。
面向对象的设计将在OOA模型的基础上引入界面管理、任务管理和数据管理三部分的内容。
8.面向对象的程序设计方法有哪些优点?
答:由于对象的概念能够以更接近实际问题的原貌和实质的方式来表述和处理这些问题,所以面向对象的软件开发方法比以往面向过程的方法有更好的灵活性、可重用性和可扩展性,使得上述“分析—设计—实现”的开发过程也更加高效、快捷。
第2章 简单的Java程序
习 题
1. 简述Java编译和运行的基本方法。
答:编译可以使用JDK中的工具javac.exe。例如:
javac HelloWorldApp.java
运行Java程序则可以使用JDK提供的解释器是java.exe。例如:
java HelloWorldApp
2. 下载并安装JDK软件包,尝试查看其中的JDK文档。 答: Java编程的基本工具包是JDK(Java Development Kit)。JDK是Sun公司免费提供的开发、运行Java程序的基本软件,它可以在Windows及Unix两种平台下使用。常用的版本是JDK1.2.2, JDK1.3.0,JDK1.4等。可以从http://java.sun.com网站下载较新的版本,
2-2
如JDK1.5(也称为JDK5.0)。
JDK文档也可以从网上下载。
3.编写一个Java Application,利用JDK软件包中的工具编译并运行这个程序,在屏幕上输出“Welcome to Java World!”。
答:见程序。
4.编写一个Java Applet,使之能够在浏览器中显示“Welcome to Java Applet World!”的字符串信息。
答:见程序。
5.编写一个HTML文件,将上题中生成的Applet字节码嵌入其中,并用WWW浏览器观看这个HTML文件规定的Web页面。
答:与上一题同。
6.编写一个程序,能够从键盘上接收两个数字,然后计算这两个数的积。 答:见程序。
7.编写一个程序,从两个文本框中接收两个数字,然后计算这两个数的积。 答:见程序。
8.常用的集成开发工具有哪些?各有什么特点?
答:常用的集成开发工具包括:Borland公司出品的Jbuilder, Sun公司出品的Java Workshop, IBM公司的Visual Age for Java,Oracle公司的Java Develop,等等。另外,Symantec公司的Visual Café 也是著名的Java开发工具。近来,Eclipse也是使用很广的集成开发工具。
它们各自的特点略。
第3章 数据运算、流控制、数组
习 题
1.简述Java程序的构成。如何判断主类?下面的程序有几处错误?如何改正,这个程序的源代码应该保存成什么名字的文件?
public class MyJavaClass {
public static void main() {
System.out.printIn(\; }
System.out.printIn(\程序结束。\;
3-3
}
答:一个复杂的程序可由一个至多个Java源程序文件构成,每个文件中可以有多个类定义。一般的Java源程序文件由以下三部分组成:
package 语句; (0句—1句) import 语句; (0句—多句) 类定义 (1个—多个类定义)
这里所说的主类是指程序中含有main()方法的类。
上面的示例程序中的错误主要在于拼写,如:点及分号应该用西文的;printIn中的大写字母I应改为小写字母l;另外,main()方法应该带参数,改为:
public static void main(String [] argvs)
2.Java有哪些基本数据类型?写出int型所能表达的最大、最小数据。 答:Java中定义了4类/8种基本数据类型: (1)逻辑型——boolean
(2)整数型——byte, short, int, long (3)浮点数型——float, double (4)字符型——char
其中整型int占4个字节,其范围为 -2147483648-2147483647。
3.Java的字符采用何种编码方案?有何特点?写出五个常见的转义符。
答:char(字符型)是用Unicode编码表达的字符,在内存中占两个字节。由于Java的字符类型采用了一种新的国际标准编码方案——Unicode编码,这样便于东方字符和西方字符处理,这样与其他语言相比,Java处理多语种的能力大大加强。
常见的转义符,如: \\' 单引号字符 \\'' 双引号字符 \\\\ 反斜杠字符 \\r 回车 \\n 换行 4. Java对标识符命名有什么规定,下面这些标识符哪些是对的?哪些是错的?错在哪里?
(1)MyGame (2)_isHers (3)2JavaProgram (4)Java-Visual-Machine (5)_$abc 答:标识符可以由编程者自由指定,但是需要遵循—定的语法规定。标识符要满足如下的规定:
(1)标识符可以由字母、数字和下划线(_)、美元符号($)组合而成。 (2)标识符必须以字母、下划线或美元符号开头,不能以数字开头。
在实际应用标识符时,应该使标识符能一定程度上反映它所表示的变量、常量、对象或类的意义,这样程序的可读性会更好。
题中的标识符中的(3)不对,因为用数字开头了,(4)也不对,因为其中用了减号。
5.什么是常量?什么是变量?字符变量与字符串常量有何不同?
答:常量是在程序运行的整个过程中保持其值不改变的量。变量是在程序的运行过程中数值可变的数据,通常用来记录运算中间结果或保存数据。
3-4
字符变量中存放一个字符,字符串常量中存放一串字符。
6.什么是强制类型转换?在什么情况下需要用到强制类型转换?
答:强制类型的基本方式是指用以下方式显式地进行数据类型的转换:
(类型)表达式
一般地说,在赋值运算符两侧的类型不一致的情况下,则需要进行自动或强制类型转换。变量从占用内存较少的短数据类型转化成占用内存较多的长数据类型时,可以不做显式的类型转换,Java会自动转换;而将变量从较长的数据类型转换成较短的数据类型时,则必须做强制类型转换。
7.Java有哪些算术运算符、关系运算符、逻辑运算符、位运算符和赋值运算符?试列举单目和三目运算符。
答:在Java中,按照运算符功能来分,基本的运算符有下面几类:
1.算术运算符(+,-,*,/,%,++,--) 2.关系运算符(>,<,>=,<=,==,!=) 3.布尔逻辑运算符(!,&&,||,&,|) 4.位运算符(>>,<<,>>>,&,|,^,~) 5.赋值运算符(=,及其扩展赋值运算符如+=) 6.条件运算符( ?:)
7.其他 (包括分量运算符·,下标运算符 [],实例运算符instanceof,内存分配运算符new,强制类型转换运算符 (类型),方法调用运算符 () 等) 其中,单目运算符如-,!,而三目运算符只有一个,即条件运算符(?: )。
8.编写一个字符界面的Java Application程序,接受用户输入的一个浮点数,把它的整数部分和小数部分分别输出。
答:见程序。
9.编写一个字符界面的Java Application程序,接受用户输入的10个整数,比较并输出其中的最大值和最小值。
答:见程序。
10.编写一个字符界面的Java Application程序,接受用户输入的字符,以“#”标志输入的结束;比较并输出按字典序最小的字符。
答:见程序。
11.结构化程序设计有哪三种基本流程?分别对应Java中的哪些语句?
答:任何程序都可以且只能由三种基本流程结构构成,即顺序结构、分支结构和循环结构。顺序结构直接书写,分支结构用if及switch语句书写,循环结构用for、while及do语句来书写。
12.编写一个Java程序,接受用户输入的一个l-12之间的整数(如果输入的数据不满足这个条件,则要求用户重新输入),利用switch语句输出对应月份的天数。
答:见程序。
3-5
13.在一个循环中使用break,continue和return语句有什么不同的效果?
答:break是结束循环;continue是直接进行下一次循环;return则是结束整个函数的调用。
14.编写图形界面下的Java Applet程序,接受用户输入的两个数据为上、下限,然后10个一行输出上、下限之间的所有素数。
答:见程序。
15.编写程序输出用户指定数据的所有素数因子。 答:见程序。
16.什么是数组?数组有哪些特点?Java中创建数组需要使用哪些步骤?如何访问数组的一个元素?数组元素的下标与数组的长度有什么关系?
答:数组是有序数据的集合,数组中的每个元素具有相同的数据类型,可以用一个统一的数组名和下标来惟一地确定数组中的元素。
数组要进行定义和分配空间后才能使用。 一维数组的定义方式为:
type arrayName[ ]; 或 type [ ] arrayName;
分配内存空间则要用到运算符new,其格式如下:
arrayName = new type[arraySize];
当定义了一个数组,并用运算符new为它分配了内存空间后,就可以引用数组中的每一个元素了。数组元素的引用方式为:
arrayName[index]
数组元素的下标从0开始,一直到数组的长度减1。
17.数组元素怎样进行缺省的初始化?
答:数组元素可以在定义数组的同时进行初始化。例如:
int a[ ] = {1,2,3,4,5};
用逗号(,)分隔数组的各个元素,系统自动为数组分配一定的空间。
18.编程求一个整数数组的最大值、最小值、平均值和所有数组元素的和。 答:见程序。 19.求解“约瑟夫问题”:12个人排成一圈,从1号报数,凡是数到5的人就出队列(出局),然后继续报数,试问最后一人出局的是谁。
答:见程序。
20.用“埃氏筛法”求2-100以内的素数。2-100以内的数,先去掉2的倍数,再去掉3的倍数,再去掉4的倍数,以此类推??最后剩下的就是素数。
答:见程序。
3-6
第4章 类、包和接口
习 题
1.使用抽象和封装有哪些好处?
答:抽象可以提供事物的本质特征。封装(Encapsulation)是这样一种编程机制,它把代码和其操作的数据捆绑在一起,从而防止了外部对数据和代码的干扰和滥用,保证了数据和代码的安全性。
2.编写一个Java程序片断定义一个表示学生的类student,包括域“学号”、”班号”、“姓名”、“性别”、“年龄”;方法“获得学号”、“获得班号”、“获得性别”、“获得年龄”、“修改年龄”。
答:见程序。
3.为student类定义构造方法初始化所有的域,增加一个方法public String toString()把Sttldent类对象的所有域信息组合成一个字符串。编写Application程序检验新增的功能。
答:见程序。
4.什么是最终类,如何定义最终类?试列举最终类的例子。
答:最终类是指类被final修饰符所修饰和限定的类,最终类不能被继承,即不可能有子类。如Java中的String类就是最终类。
5.如何定义静态域?静态域有什么特点?如何访问和修改静态域的数据?
答:对域使用static修饰,则定义了静态域。静态域最本质的特点是:它们是类的域,不属于任何一个类的具体对象实例。它不保存在某个对象实例的内存区间中,而是保存在类的内存区域的公共存储单元。
在Java中,静态域(类变量)可以通过类名直接访问,也可以通过实例对象来访问,两种方法的结果是相同的。
6.什么是静态初始化器?它有什么特点? 与构造方法有什么不同?
静态初始化器是由关键字static引导的一对大括号{}括起的语句组。它的作用与类的构造方法有些相似,都是用来完成初始化的工作,但是静态初始化器在三点上与构造方法有根本的不同:
(1) 构造方法是对每个新创建的对象初始化,而静态初始化器是对类自身进行初始化。 (2) 构造方法是在用new运算符产生新对象时由系统自动执行;而静态初始化器一般不
能由程序来调用,它是在所属的类加载入内存时由系统调用执行。
(3)不同于构造方法,静态初始化器不是方法,没有方法名、返回值和参数列表。 (4)同static方法一样,它不能访问实例域和实例方法。
7.如何定义方法?在面向对象程序设计中方法有什么作用?
答:方法是类的动态属性,标志了类所具有的功能和操作,用来把类和对象的数据封装在 一起。Java的方法与其他语言中的函数或过程类似,是一段用来完成某种操作的程序
4-7
片断。方法由方法头和方法体组成,其一般格式如下:
修饰符1 修饰符2 ?? 返回值类型 方法名(形式参数列表) throws异常列表{
方法体各浯句; }
8.什么是抽象方法?它有何特点?如何定义抽象方法?如何使用抽象方法?
答:被abstract所修饰的方法叫抽象方法,抽象方法的作用在为所有子类定义一个统一的接口。对抽象方法只需声明,而不需实现,即用分号(;)而不是用{},格式如下:
abstract returnType abstractMethod( [paramlist] );
9.如何定义静态方法?静态方法有何特点?静态方法处理的域有什么要求?
答:用static修饰符修饰的方法是仅属于类的静态方法,又称为类方法。与此相对,不用static修饰的方法,则为实例方法。类方法的本质是该方法是属于整个类的,不是属于某个实例的。
静态方法中,不能访问实例变量。在类方法中不能使用this 或super。
10.什么是访问控制符?有哪些访问控制符?哪些可以用来修饰类?哪些用来修饰域和方法?试述不同访问控制符的作用。
答:访问控制符是指public/private/protected等表示访问控制(Access Control)的修饰符,其作用是更好地控制类及其域、方法的存取权限,更好地实现信息的封装与隐藏,
方法的访问控制符包括private, protected, public和“默认访问控制符”。
类中限定为private的成员(域或方法)只能被这个类本身访问,即私有访问控制。 类中的成员缺省访问控制符时,称为缺省访问控制。缺省访问控制的成员可以被这个类本身和同一个包中的类所访问,即包访问控制。
类中限定为protected的成员可以被这个类本身,它的子类(包括同一个包中以及不同包中的子类)以及同一个包中所有其他的类访问。
类中限定为public的成员可以被所有的类访问。
Java中还有一种访问控制符为private proteced,它限定能被本类及其子类可以访问,而包中的其他非子类的类不能访问。
类的访问控制符或者为public,或者缺省。(但内部类可以有private、protected等访问控制符。)
如果类用public修饰,则该类可以被其他类所访问;若类缺省访问控制符,则该类只能被同包中的类访问。
11.修饰符是否可以混合使用?混合使用时需要注意什么问题?
答:修饰符可以混合使用,如public static。但也要注意一些规则,如final及abstract不能修饰同一个方法。
12.什么是继承?什么是父类?什么是子类?继承的特性给面向对象编程带来什么好处?什么是单重继承?什么是多重继承?
答:继承(Inheritance)是一个对象获得另一个对象的属性的过程。它的重要性源于它支持按层次分类概念。这与现实世界是一致的,大多数知识因为层次化分类而变得容易掌握(即
4-8
从上至下)。
在类的层次关系中,被继承的类称为父类,继承其他类的类称为子类。
使用继承,一个对象可以从它父类继承所有的通用属性,而只需定义它特有的属性。所以,正是继承机制可以使一个对象成为一个更通用类的一个特例成为可能。
一个类只有一个直接父类,称为单重继承;一个类有多个直接父类,则是多重继承。Java语言中采用单重继承。
13.如何定义继承关系? 为“学生”类派生出“小学生”、“中学生”、“大学生”、“研究生”四个类,其中“大学生”类再派生出“一年级学生”、二年级学生”、 “三年级学生”、“四年级学生”四个子类,“研究生”类再派生出“硕士生’’和“博土生’’两个子类。
答:在Java中,通过extends关键字来定义继承关系。 具体示例见源程序。 14.“子类的域和方法的数目一定大于等于父类的域和方法的数目”,这种说法是否 正确?为什么?
答:如果考虑到可以子类既可以继承父类的方法,而不能继承私有的方法,那么这种说法是不正确的。
15.什么是域的隐藏?
答:在子类中定义与父类同名的域,称为域的隐藏。
16.什么是方法的覆盖?方法的覆盖与域的隐藏有何不同?与方法的重载有何不同? 答:子类重新定义与父类同名的方法,称为对父类方法的覆盖(Overriding)。子类在重新定义父类已有的方法时,应保持与父类完全相同的方法头声明,即应与父类有完全相同的方法名、返回值和参数类型列表。
方法的重载是指定义几个同名的方法,但它们的参数类型列表不同。
17.解释this和super的意义和作用。
答:this表示这个对象本身。详细地说,在普通方法中,this表示调用这个方法的对象;在构造方法中,this表示所新创建的对象。
super指父类。在子类继承父类时,为了明确地指明父类的域和方法,就要用关键字super。
18.父类对象与子类对象相互转化的条件是什么?如何实现它们的相互转化? 答:类似于基本数据类型数据之间的强制类型转换,存在继承关系的父类对象和子类对象之间也可以在一定条件下相互转换。父类对象和子类对象的转化需要注意如下原则:
(1)子类对象可以被视为是其父类的一个对象。如一个Student对象也是一个Person对象。 (2)父类对象不能被当作是其某一个子类的对象。
(3)如果一个方法的形式参数定义的是父类对象,那么调用这个方法时,可以使用子类对象作为实际参数。
(4)如果父类对象引用指向的实际是一个子类对象,那么这个父类对象的引用可以用强制类型转换转化成子类对象的引用。
4-9
19.构造方法是否可以被继承?是否可以被重载?试举例。
答:构造方法不可以被继承,但是可以被子类的构造方法所调用。 构造方法可以被重载。如: Student(String name ){}
Student(String name, int age ){}
20.什么是包?它的作用是什么?
答:包是一种松散的类的集合,包的作用在于提供了一种命名机制和可见性限制机制。
21.如何创建包?在什么情况下需要在程序里创建包?
答:package语句作为Java源文件的第一条语句,指明该文件中定义的类所在的包。它的格式为:
package pkg1[.pkg2[.pkg3…]];
由于Java编译器为每个类生成一个字节码文件,且文件名与public的类名相同,因此同名的类有可能发生冲突。这时就需要创建包。
22.如何引用包中的某个类?如何引用整个包?如果编写Java Applet程序时想把整个java.applet包都加载,则应该怎么做?
答:为了能使用Java中已提供的类,我们需要用import语句来引入所需要的类。import语句的格式为:
import package1[.package2…]. (classname |*);
其中package1[.package2?]表明包的层次,与package语句相同,它对应于文件目录,classname则指明所要引入的类,如果要从一个包中引入多个类,则可以用星号(*)来代替。例如:
import java.awt.*; import java.util.Date;
如果编写Java Applet程序时想把整个java.applet包都加载,可以使用:
import java.applet.*;
23.CLASSPATH是有关什么的环境变量?它如何影响程序的运行?如何设置和修改这个环境变量?
答:在编译和运行程序中,经常要用到多个包,怎样指明这些包的根目录呢?简单地说,包层次的根目录是由环境变量CLASSPATH来确定的。具体操作有两种方法: 一是在java及javac命令行中,用-classpath选项来指明: 如:
java –classpath d:\\tang\\ch04;c:\\java\\classes;. pk.TestPkg Set CLASSPATH= d:\\tang\\ch04;c:\\java\\classes;.
二是设定classpath环境变量,用命令行设定环境变量,如:
在Windows中还可以按第2章中的办法设定环境变量。
24.什么是接口?为什么要定义接口?接口与类有何异同?如何定义接口?使用什么关键字?
答:Java中的接口(interface)在语法上有些相似于类(class),它定义了若于个抽象方法和
4-10
常量,形成一个属性集合,该属性集合通常对应了某一组功能,其主要作用是可以帮助实现类似于类的多重继承的功能。
接口中只能有方法名及常数名,不能像类那样有方法的实现体。 定义接口,使用关键字interface。 具体方法是:
[public]interface接口名[extends父接口名列表] { //接口体 //常量域声明
[public][static][final]域类型域名=常量值; //抽象方法声明
[public][abstract]返回值方法名(参数列表)[throw异常列表]; }
25.一个类如何实现接口?实现某接口的类是否一定要重载该接口中的所有抽象方法? 答:一个类要实现接口时,在类的声明部分,用implements关键字声明该类将要实观哪些接口。
如果实现某接口的类不是abstract的抽象类,则在类的定义部分必须实观指定接口的所有抽象方法。如果其直接或间接父类中实现了接口,父类所实现的接口中的所有抽象方法都必须有实在的方法体。也就是说,非抽象类中不能存在抽象方法。
第5章 深入理解Java语言
习 题
1.什么是多态?面向对象程序设计为什么要引人多态的特性?使用多态有什么优点? 答:多态性(Polymorphism来自希腊语,意思是多种形态)是指允许一个接口访问动作的通用类的性质。一般地,多态性的概念常被解释为“一个接口,多种方法”。这意味着可以为一组相关活动设计一个通用接口。多态性允许用相同接口规定一个通用类来减轻问题的复杂度。选择适当的动作(方法)适应不同环境的工作则留给编译器去做。作为编程者,无需手工去做这些事情,只需利用通用接口即可。
多态的特点大大提高了程序的抽象程度和简洁性,更重要的是,它最大限度地降低了类和程序模块之间的耦合性,提高了类模块的封闭性,使得它们不需了解对方的具体细节,就可以很好地共同工作。这个优点对于程序的设计、开发和维护都有很大的好处。
2.虚方法调用有什么重要作用?具有什么修饰符的方法不能够使用虚方法调用? 答:使用虚方法调用的作用在于:在使用上溯造型的情况下,子类对象可以当做父类对象,对于重载或继承的方法,Java运行时系统根据调用该方法的实例的类型来决定选择哪个方法调用。对子类的一个实例,如果子类重载了父类的方法,则运行时系统调用子类的方法,如果子类继承了父类的方法(未重载),则运行时系统调用父类的方法。
使用static、private或final所修饰的方法不能够使用虚方法调用。
5-11
3.用默认构建器(空自变量列表)创建两个类:A和B,令它们自己声明自己。从A继承一个名为C的新类,并在C内创建一个成员B。不要为C创建一个构建器。创建类C的一个对象,并观察结果。
答:具体程序见源文件。
程序的运行结果可以看到A和B的构造方法都被调用了。
4.创建Rodent(啮齿动物):Mouse(老鼠),Gerbil(鼹鼠),Hamster(大颊鼠)等的一个继承分级结构。在基础类中,提供适用于所有Rodent的方法,并在派生类中覆盖它们,从而根据不同类型的Rodent采取不同的行动。创建一个Rodent数组,在其中填充不同类型的Rodent,然后调用自己的基础类方法,看看会有什么情况发生。
答:具体程序见源文件。
可以看出虚方法调用带来的多态效果。
5.Java中怎样清除对象?能否控制Java中垃圾回收的时间?
答:Java中,无用的对象由系统自动进行清除和内存回收的过程,编程者可以不关心如何回收以及何时回收对象。
对象的回收是由Java虚拟机的垃圾回收线程来完成的。编程者不能完全控制垃圾回收的时间。
6.内部类与外部类的使用有何不同?
答:在封装它的类的内部使用内部类,与普通类的使用方式相同;在其他地方使用内部类时,类名前要冠以其外部类的名字才能使用,在用new创建内部类时,也要在new前面冠以对象变量。
7.怎样使用匿名类的对象?
答:在类及其方法中,可以定义一种匿名类,匿名类有以下几个特点: (1) 这种类不取名字,而直接用其父类的名字或者它所实现的接口的名字。
(2) 类的定义与创建该类的一个实例同时进行,即类的定义前面有一个new。也不使用
关键词class,同时也带上()表示创建对象。也就是说,匿名类的定义方法是:
new 类名或接口名 () { ……… }
(3) 类名前面不能有修饰符。
(4) 类中不能定义构造方法,因为它没有名字。在构造对象时,直接使用父类的构造方
法。如果实现接口,则接口名后的圆括号中不能带参数。
8.方法中定义的内部类是否可以存取方法中的局部变量?
答:方法中的内部类,不能访问该方法的局部变量,除非是final的局部变量或final的参变量。
5-12
第6章 异常处理
习 题
1.异常可以分成几类? 答:Java的异常类都是java.lang.Trowable的子类。它派生了两个子类:Exception和Error。其中Error类由系统保留,而Exception类则供应用程序使用。
2.用main()创建一个类,令其抛出try块内的Exception类的一个对象。为Exception的构建器赋予一个字串参数。在catch从句内捕获异常,并打印出字串参数。添加一个finally从句,并打印一条消息。
答:见程序。 3.用extends关键字创建自己的异常类。为这个类写一个构建器,令其采用String参数,并随同String句柄把它保存到对象内。写一个方法,令其打印出保存下来的String。创建一个try-catch从句,练习实际操作新异常。
答:见程序。
4.写一个类,并在一个方法抛出一个异常。试着在没有异常规范的前提下编译它,观察编译器会报告什么。接着添加适当的异常规范。在一个try-catch从句中尝试自己的类以及它的异常。
答:见程序。
第7章 工具类及常用算法
习 题
1.在所有的Java系统类中,Object类有什么特殊之处?它在什么情况下使用?
答:Object类是Java程序中所有类的直接或间接父类,也是类库中所有类的父类。正因为Object类是所有Java类的父类,而且可以和任意类型的对象匹配,所以在有些场合可以使用它作为形式参数的类型。使用Object类可以使得该方法的实际参数为任意类型的对象,从而扩大了方法的适用范围。
2.数据类型包装类与基本数据类型有什么关系?
答:Java的基本数据类型用于定义简单的变量和属性将十分方便,但为了与面向对象的环境一致,Java中提供了基本数据类型的包装类(wrapper),它们是这些基本类型的面向对象的代表。与8种基本数据类型相对应,基本数据类型的包装类也有8种,分别是:Character,Byte, Short, Integer, Long, Float, Double, Boolean。
3.Math类用来实现什么功能?设x,y是整型变量,d是双精度型变量,试书写表达式
7-13
完成下面的操作:
(1)求x的y次方; (2)求x和y的最小值; (3)求d取整后的结果;
(4)求d的四舍五入后的结果; (5)求atan(d)的数值。 答:相应的表达式为: (1) Math.pow(x, y) (2) Math.min(x, y) (3) Math.floor(d) (4) Math.rint(d) (5) Math.atan(d)
4.Math.random()方法用来实现什么功能?下面的语句起到什么作用?
(int)(Math.random()*6)+1
答:Math.random()用于产生随机数(0到1之间,包含0,但不包含1)。
上面的表达式表示1到6之间的一个随机整数(包含1及6)。
5.编程生成100个l~6之间的随机数,统计1—6之间的每个数出现的概率;修改程 序,使之生成1 000个随机数并统计概率;比较不同的结果并给出结论。
答:见程序。
结论是次数越多越均匀。
6.什么是字符串?Java中的字符串分为哪两类?
答:字符串是是字符的序列,在Java中,字符串,无论是常量还是变量,都是用类的对象来实现的。
字符串可以分为两大类,一类是创建之后不会再做修改和变动的字符串常量;另一类是创建之后允许再做更改和变化的字符串。前者是String类,后者是StringBuffer类。
7.编写Applet程序,接受用户输入的一个字符串和一个字符,把字符串中所有指定的字符删除后输出。
答:见程序。
8.编程判断一个字符串是否是回文。 答:见程序。
9.String类的concat()方法与StringBuffer类的append()方法都可以连接两个字符串,它们之间有何不同?
答:String的concat()方法不改变原字符串本身,而是产生一个新的字符串。 StringBuffer的append()方法则改变其中的字符串内容,而不产生一个新的对象。 10.什么是递归方法?递归方法有哪两个基本要素?编写一个递归程序求一个一维数组所有元素的乘积。
答:简单地说,递归方法就是直接或间接调用自己的方法。递归方法有两个要素:一
7-14
个是求得范围缩小的同性质问题的结果;另一是利用这个已得到的结果和一个简单的操作求得问题的最后解答。
具体程序见源文件。
11.你了解几种排序算法?它们各自有什么优缺点?分别适合在什么情况下使用?
答:常见的排序算法有:冒泡排序、选择排序、快速排序等。前二者较简单,适合于元素个数较少的场合,而快速排序法则速度较快,适合于各种场合。
12.向量与数组有何不同?它们分别适合于什么场合?
答:向量的元素个数可以动态地增减,而数组则不行。前者适合于元素个数动态改变的场合,后者则适合于元素个数不变的场合。
13.Java中有几种常用的集合类及其区别如何?怎样获取集合中的各个元素。
答:常用的集合有向量、堆栈、队列等。它们可以使用枚举等方法来获集合中的元素,有的还可使用elemnetAt()等方法来获取其中的元素。
14.队列和堆栈各有什么特点?
答:队列和堆栈都是线性数据结构,队列遵循“先进先出”(FIFO)原则,堆栈遵循“后进先出”(LIFO)原则。
15.求解“鸡兔同笼问题”:鸡和兔在一个笼里,共有腿100条,头40个,问鸡兔各有几只。
答:见程序。
16.求解“百鸡问题”。已知公鸡每只3元,母鸡每只5元,每3只小鸡1元。用100元钱买100只鸡,问每种鸡应各买多少。
答:见程序。
17.求四位的水仙花数。即满足这样条样的四位数:各位数字的4次方和等于该数自身。
答:见程序。
18.求1000以内的“相亲数”。所谓相亲数是指这样的一对数:甲数的约数之和等于乙数,而乙数的约数之和等于甲数。
答:见程序。 19.“哥德巴赫猜想”指出,每个大于6的偶数,都可以表示为两个素数的和。试用程序将6-100内的所有偶数都表示为两个素数的和。
答:见程序。
20.菲波那契(Fibonacci)数列的第一项是0,第二项是l,以后各项都是前两项的和,试用递归算法和非递归算法各编写一个程序,求菲波那契数列第N项的值。
答:见程序。
7-15
21.用迭代法编写程序用于求解立方根。
答:见程序。注意到x3-a=0的牛顿迭代公式为x-(x3-a)/(3 x2)。
22.用迭代法编写程序用于求解以下方程: x2+sinx-1.0=0 在-1附近的一个根
答:见程序。注意到该方程的牛顿迭代公式为x-( x2+sinx-1.0)/(2 x+cosx)。
23.作出对应于不同c值的Julia集的图:
c=-1+0.005i c=-0.2+0.75i c=0.25+0.52i c=0.5+0.55i
答:见程序。
24.求“配尔不定方程”的最小正整数解: x2 – Dy2 =1
其中D为某个给定的常数。令D=92,求其解。再令D=29,求其解。这里都假定已知其解都在10000以内。
答:见程序。
25.从键盘上输入10个整数,并放入一个一维数组中,然后将其前5个元素与后5个元素对换,即:第1个元素与第10个元素互换,第2个元素与第9个元素互换??第5个元素与第6个元素互换。分别输出数组原来各元素的值和对换后各元素的值。
答:见程序。
26.有一个n*m的矩阵,编写程序,找出其中最大的那个元素所在的行和列,并输出其值及行号和列号。
答:见程序。
第8章 Java的多线程
习 题
1.程序中怎样创建线程?
答:创建线程对象有两种方法,一是通过继承Thread类,一是向Thread类传递一个Runnable对象。
2.程序中怎样控制线程?
答:启动一个线程:调用start()方法。 终止或暂停一个线程:一般采取给线程设定一个标记变量的方法,来决定线程是否应该
8-16
终止或暂停。
设定线程的优先级:使用Thread对象的setPriority( int priority)方法。
3.多线程之间怎样进行同步?
答:可以通过使用关键字synchronized,使用对象的wait()、notify()方法来实现线程间的同步。
4.编写一个程序,用一个线程显示时间,一个线程用来计算(如判断一个大数是否是质数),当质数计算完毕后,停止时间的显示。
答:见程序。
第9章 流、文件及基于文本的应用
习 题
1.字节流与字符流有什么差别?
答:按处理数据的类型,流可以分为字节流与字符流,它们处理的信息的基本单位分别是字节(byte)与字符(char)。
2.节点流与处理流有什么差别?
答:节点流(Node Stream): 直接与特定的地方(如磁盘、内存、设备等)相连,可以从/向一个特定的地方(节点)读写数据。如文件流FileReader。
处理流(Processing Stream): 是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读/写功能。处理流又称为过滤流。如缓冲处理流BufferedReader。
3.输入流与输出流各有什么方法?
答:输入流InputStream类最重要的方法是读数据的read()方法。read()方法功能是逐字节地二进制的原始方式读入数据。另外,它还有skip(long n)、reset()、available()、close()方法等。
输出流OutputStream类的重要方法是write(),它的功能是将字节写入流中。另外,它还有flush()及close()方法。
4.怎样进行文件及目录的管理?
答:Java支持文件管理和目录管理,它们都是由专门的java.io.File类来实现。每个File类的对象表示一个磁盘文件或目录,其对象属性中包含了文件或目录的相 关信息,如名称、长度、所含文件个数等,调用它的方法则可以完成对文件或目录的常用管 理操作,如创建、删除等。
5.编写一个程序,从命令上行接收两个实数,计算其乘积。 答:参见程序。
9-17
6.编写一个程序,从命令行上接收两个文件名,比较两个文件的长度及内容。 答:参见程序。
7.编写一个程序,能将一个Java源程序中的空行及注释去掉。 答:参见程序。
第10章 图形用户界面
习 题
1.试列举出图形用户界面中你使用过的组件。 答:常用的容器组件如:边框窗体(Frame)、对话框(Dialog)、面板(Panel)、及滚动面板(ScrollPane)等。常用的非容器组件,如按钮(Button),标签(Label),文本类组件(TextField及TextArea),复选按钮(Checkbox),单选按钮组(CheckboxGroup),Choice(下拉列表),List(列表),滚动条(Scrollbar),画布(Canvas)等。
2.Java中常用的布局管理各有什么特点?
答:常用的布局管理有5种,即FlowLayout,BorderLayout,CardLayout,GridLayout和GridBagLayout,它们的特点如下:
FlowLayout是容器Panel和它的子类Applet缺省使用的布局管理器,它将将其中的组件按照加入 的先后顺序从左向右排列,一行排满之后就下转到下一行继续。
BorderLayout是容器Frame和Dialog缺省使用的布局管理器,它把容器内的空间简单地划分为东、西、南、北、中五个区域。
CardLayout的容器表面上可以容纳多个组件,但是实际上同一时刻容器只能从这些组件中选出一个来显示,就像一叠“扑克牌”每次只能显示最上面的一张一样,这个被显示的组件将占据所有的容器空间。
GridLayout是使用较多的布局管理器,其基本布局策略是把容器的空间划分成若干 行乘若干列的网格区域,组件就位于这些划分出来的小格中。
在GridBagLayout中,可以为每个组件指定其包含的网格个数,可以保留组件原来的大小,可以以任意顺序随意加入容器的任意位置,从而可以真正自由地安排容器中每个组件的大小和位置。
3.简述Java的事件处理机制。
答:在Java中通过实现事件监听器(Eventistener)来实现对事件的处理。事件监听器是一些事件的接口,这些接口是 java.awt.AWTEventListener的子类。接口中含有相关的方法,每个方法中可以编程来处理相关的事件。
每个界面对象在需要处理某种事件时,先进行事件的注册。注册的过程就是将界面对象与事件监听器联系在一起的过程。
4.什么是事件源?什么是监听者?
答:事件源是指发出事件的界面对象。监听者是指处理这些事件的对象,它实现了一
10-18
些相关事件处理方法的接口,在一定意义上监听者是具体处理这些事件的程序。
5.列举java.awt.event包中定义的事件类,并写出它们的继承关系。
答:在java.awt.event包中有一系列的事件类,如KeyEvent及MouseEvent等。这些事件类都是从AWTEvent类派生而来的。事件类之间的继承关系如下图所示。
6.列举GUI的各种标准组件和它们之间的层次继承关系。
答:组件(Component)分为容器(Container)类和非容器类组件两大类。容器本身也是组件,但容器中可以包含其他组件,也可以包含其他容器。非容器类组件的种类较多,如按钮(Button),标签(Label),文本类组件TextComponent等等。
容器又分为两种顶层容器和非顶层容器两大类。顶层容器是可以独立的窗口,顶层容器的类是Window,Window的重要子类是Frame和Dialog。非顶层容器,不是独立的窗口,它们必须位于窗口之内,非顶层容器包括Panel及ScrollPane等, Panel的重要子类是Applet。其中,Panel和Applet的容器都是无边框的;ScrollPanel一组是可以自动处理滚动操作的容器;Window,Frame,Dialog和FileDialog是一组大都含有边框,并可以移动、放大、缩小、关闭的功能较强的容器。
AWT组件的分类如下图所示:
Label, TextComponent,......?Button,? ??Frame?ComponentWindow?????Dialog?Container?Panel,ScrollPane?,.......??组件间的继承关系,如下图所示:
7.Component类有何特殊之处?其中定义了哪些常用方法? 答:Component类是所有组件和容器的抽象父类,其中定义了一些每个容器和组件都可能用到的方法,较常用的有:
(1)public void add(PopupMenu popup):在组件上加入一个弹出菜单,当用户用鼠标右键单击组件时将弹出这个菜单。
10-19
(2)public Color getBackground():获得组件的背景色。 (3)public Font getFont():获得组件使用的字体。
(4)public Color getForeground():获得组件的前景色。
(5)public Graphics getGraphics():获得在组件上绘图时需要使用的Graphics对象。 (6)public void repaint(int x,int y,int width,int height):以指定的坐标点(x,y)为左上角,重画组件中指定宽度(width)、指定高度(height)的区域。
(7)public void setBackground(Color c):设置组件的背景色。
(8)public voidsetEnabled(boolean b):设置组件的使能状态。参数b为真则组件使能,否则组件不使能。只有使能状态的组件才能接受用户输入并引发事件。
(9)public void setFont(Font f):设置组件使用的字体。
(10)public void setSize(int width,int height):设置组件的大小。
(11)public void setVisible(boolean b):设置组件是否可见的属性。参数b为真时,组件在包括它的容器可见时也可见;否则组件不可见。
(12)public void setForeground(Color c):设置组件的前景色。 (13)public void requestFocus():使组件获得注意的焦点。
8.将各种常用组件的创建语句、常用方法、可能引发的事件、需要注册的监听者和监听者需要重载的方法综合在一张表格中画出。
答:常用的组件与事件的关系如下表所示: 组 件 Button Canvas Checkbox CheckboxMenuItem Choice Component Comtainer Dialog Frame Label List MenuItem Panel Scrollbar ScrollPane TextArea TextField Window 注: Act: Adj: Cmp: Cnt:
Action 行动事件 Adjustment调整 Component组件事件 Container容器事件
Act Y Y Y Y Adj Y Cmp Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Cnt Y Y Y Y Y Y Foc Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Itm Y Y Y Y Key Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Mou Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y MM Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Txt Y Y Win Y Y Y 10-20
Foc: Focus 焦点事件 Itm: Key: Mou: MM: Txt:
Item 条目事件 Key键盘事件 Mouse 鼠标事件
Mouse Motion鼠标移动事件 Text 文本事件
Win: Window 窗口事件
9.编写Applet包括一个标签、一个文本框和一个按钮,当用户单击按钮时,程序把文本框中的内容复制到标签中。
答:见程序。
10.编写Applet程序,画出一条螺旋线。 答:见程序。
11.编写Applet程序,用paint()方法显示一行字符串,Applet包含两个按钮“放大”和“缩小”,当用户单击“放大”时显示的字符串字体放大一号,单击“缩小”时显示的字符串字体缩小一号。
答:见程序。
12.编写Applet程序,包含三个标签,其背景分别为红、黄、蓝三色。 答:见程序。
13.使用Checkbox标志按钮的背景色,使用CheckboxGroup标志三种字体风格,使用Choice选择字号,使用List选择字体名称,由用户确定按钮的背景色和前景字符的显示效果。
答:见程序。
14.使用滚动条:编写一个Applet包含一个滚动条,在Applet中绘制一个圆,用滚动条滑块显示的数字表示该圆的直径,当用户拖动滑块时,圆的大小随之改变。
答:见程序。
15.编写一个Applet响应鼠标事件,用户可以通过拖动鼠标在Applet中画出矩形,并在状态条显示鼠标当前的位置。使用一个Vector对象保存用户所画过的每个矩形并显示、响应键盘事件,当用户击键q时清除屏幕上所有的矩形。
答:见程序。 16.编写Applet程序实现一个计算器,包括十个数字(0~9)按钮和四个运算符 (加、减、乘、除)按钮,以及等号和清空两个辅助按钮,还有一个显示输入输出的文本框。试用BorderLayout和GridLayout实现。
答:见程序。
17.Panel与Applet有何关系?Panel在Java程序里通常起到什么作用?
答:Panel类是Applet类的父类。Panel在Java程序里通常用作容器,用于将其他对象
10-21
进行布局。
18.为什么说Frame是非常重要的容器?为什么使用Frame的程序通常要实现 WindowListener?关闭Frame有哪些方法?
答:Frame是可以独立存在的顶层容器,相当于我们在Windows中看见的独立窗口,所以它是相当重要的。由于Frame类自己没有自动关闭的功能,所以通常要实现WindowListener来处理关闭事件。
常用的关闭窗口的方法有三个:一个是设置一个按钮,当用户点击按钮时关闭窗口;第二个方法是对WINDOWS_CLOSING事件做出响应,关闭窗口;第三个方法是使用菜单命令。前一种方法需要专门的按钮,而后一种方法实现WindowListener接口所需的代码较多,无论使用何种方法,都需要用到关闭Frame的dispose()方法。
19.练习使用列表框及组合框。 答:略。(可参见第13题)。
20.Swing组件与AWT件有何区别。
答:Swing是第二代GUI开发工具集,与AWT是第一代GUI开发工具集。与AWT相比,Swing具有更好的可移植性,Swing提供了更完整的组件,增加了许多功能。此外,Swing引入了许多新的特性和能力,如:所有的组件都很小巧的(轻量级的),支持双缓存,支持拖放,支持文本、图形、工具提示(Tooltip),新的布局管理,更多的组件等等。
21.绘出以下函数的曲线:
y = 5 * sin(x) + cos(3*x ) y = sin(x) + sin(6*x)/10 答:见程序。
22.绘出以下函数的曲线:
r=cos(2θ) r=cos(3θ) 答:见程序。
23.根据本章的所学习的内容用JavaApplication编写一个模拟的文本编辑器。给文本编辑器增加设字体字号的功能。
答:见程序。
第11章 网络、多媒体、数据库编程
习 题
1.创建一个服务器,用它请求用户输入密码,然后打开一个文件,并将文件通过网络
11-22
连接传送出去。创建一个同该服务器连接的客户,为其分配适当的密码,然后捕获和保存文件。在自己的机器上用localhost(通过调用InetAddress.getByName(null)生成本地IP地址127.0.0.1)测试这两个程序。
答:见程序。
2.修改前一练习的程序,用多线程机制对多个客户进行控制。 答:见程序。
3.通过阅读JDK的文档,了解Java2D, Java3D, JavaSound等API的内容。 答:略。
4.通过JDK中的Demo程序,了解Java2D中强大的图像处理能力。 答:略。(注:Demo程序在JDK下的demo\\jfc\\Java2D目录下)
5.J2SE, J2EE, J2ME有什么差别? 答:目前,Java 2平台有3个版本,它们是适用于小型设备和智能卡的Java 2平台Micro版( Java 2 Platform Micro Edition,J2ME)、适用于桌面系统的Java 2平台标准版(Java 2 Platform Standard Edition,J2SE)、适用于创建服务器应用程序和服务的Java 2平台企业版(Java 2 Platform Enterprise Edition,J2EE)。 这三种版本从Java语言的角度上是一致的,但在功能的裁减、系统的构架、应用的环境等方面又各有特色。
6.了解J2EE中的关键技术。 答:略。
7.下载J2EE、J2ME软件,并安装和阅读相关的文档。 答:略。
11-23