常量,形成一个属性集合,该属性集合通常对应了某一组功能,其主要作用是可以帮助实现类似于类的多重继承的功能。
接口中只能有方法名及常数名,不能像类那样有方法的实现体。 定义接口,使用关键字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