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