当前位置:文档之家› java语言程序设计教程第二版习题解答

java语言程序设计教程第二版习题解答

习 题 一

1. 简述面向对象软件开发方法的重要意义。




【答】:

面向对象的软件开发方法按问题论域来设计模块,以对象代表问题解的中心环节,力求
符合人们日常的思维习惯,采用“对象+消息”的程序设计模式,降低或分解问题的难度
和复杂性,从而以较小的代价和较高的收益获得较满意的效果,满足软件工程发展需要。



2.解释下面几个概念:

1)对象 2)实例 3)类 4)消息 5)封装 6)继承 7)多态

【答】:

1) 对象:就是现实世界中某个具体的物理实体在计算机中的映射和体现,是由属性和
操作所构成的一个封闭整体。


2) 实例:是对象在计算机内存中的映像。


3) 类:是描述对象的“基本原型”,是描述性的类别或模板,即对一组对象的抽象。
它定义一组对象所能拥有的共同特征,用以说明该组对象的能力与性质。


4) 消息:消息是对象之间进行通信的一种数据结构。


5) 封装:封装性是保证软件部件具有优良的模块性的基础。面向对象的类是封装良好
的模块,类定义将其说明(用户可见的外部接口)与实现(用户不可见的内部实现)
显式地分开,其内部实现按其具体定义的作用域提供保护。


6) 继承:继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。


7) 多态:多态性是指一个名字具有多种语义,即指同一消息为不同对象所接受时,可
以导致不同的操作。




3. 对象“汽车”与对象“小汽车”是什么关系,对象“汽车”与“轮胎”又是什么关系?






【答】:

对象“汽车”与对象“小汽车”具有继承关系,即对象“小汽车”继承了对象“汽车”。
“轮胎”是对象“汽车”的一个属性,所以对象“汽车”包含“轮胎”,二者是包含关
系。



4. 简述Java语言的主要特点。




【答】:

Java语言的主要特点:(1)简单性 (2)面向对象 (3)分布式 (4)健壮性 (5)
结构中立 (6)安全性 (7)可移植 (8)解释的(9)高性能 (10)多线程 (11)
动态性



5.简述Java语言与C/C++语言的主要差异。

【答】:

Java基于C++,与之有许多相似之处,但其设计更易于使用,它们之间主要差异有:

(1)Java中无C/C++中最复杂并有潜在危险的指针

(2)Java无C/C++中的#include 、#define和头文件。

(3)Java无C/C++中的structure,union及typedef。


(4)Java无C/C++中的函数、指针和多重继承。

(5)Java无C/C++中的goto指令。

(6)Java无C/C++中的操作符重载(Operatior Overloading)、自动类型的转换



(7)Java系统要求对对象进行相容性检查,以防止不安全的类型转换。

(8) Java语言最强大的特性之一是它的平台独立性,Java可以处理好平台之间的
移植问题。

(9)Java语言中没有全局变量的定义,只能通过公用的静态的变量实现,从而减少了
引起错误的地方。



6.什么叫Java虚拟机?什么叫Java的字节码?

【答】:

Java虚拟机是一个软件系统,它可以翻译并运行Java字节码。它是Java的核心,保
证了在任何异构的环境下都可运行Java程序,解决了Java的跨平台的问题。

Java的字节码(byte‐code)是与平台无关的是虚拟机的机器指令



7.简述Java程序的运行过程。

【答】:

首先编写Java源代码程序,通过Java虚拟机编译成.class的字节码程序。然后通过然
后再执行翻译所生成的字节代码,属于先解释后执行方式。在运行时,字节码载入器
用于调入包含、继承所用到的所有类,确定内存分配,变成真正可执行的机器码。由,
再通过字节码校验器就是用于检验字节码是否正确,如果通过校验,再由系统执行平
台解释执行。



8.Java程序分哪两类?各有什么特点?

【答】:

Java程序根据程序结构的组成和运行环境的不同可以分为两类:Java Application(Java
独立应用程序)和Java Applet(Java小应用程序)。Java独立应用程序是一个完整的程
序,需要独立的Java解释器来解释执行;而Java小应用程序则是嵌在Web页面中的非
独立应用程序,由Web浏览器内部所包含的Java解释器来解释执行,为Web页面增加
交互性和动态性。


习 题 二

1. Java语言对标识符命名有何规定,下面这些标识符哪些是合法的,哪些是不合法的。




1)Myname 2) JavaLanguage 3) 2Person 4) _is_Has 5) $12345。

【答】:

合法的标识符有:Myname、JavaLanguage、_is_Has

非法的标识符有:2Person、$12345



2.Java有哪些基本数据类型,与C/C++相比有何特点?复合数据类型是哪几种?

【答】:

基本数据类型有:整型数据类型(字节整型、短整型、整型、长整型),实数数据类型
(单精度实数、双精度实数),字符数据类型和布尔数据类型。

与C/C++相比,Java的数据类型与C++相似,但有两点不同:①在Java语言中所有的数
据类型是确定的,与平台无关,所以在Java中无sizeof操作符;②Java中每种数据类型都对
应一个默认值。这两点体现了Java语言的跨平台性和完全稳定性。

Java的复合类型是由用户根据需要自己定义并实现其运算的数据类型,主要有类类型、
接口和数组等。



3. Java的字符类型采用何种编码方案?有何

特点?




【答】:

Java的字符类型采用16位Unicode(全球文字共享编码)方式,用16位来表示东西方
字符。由于采用Unicode编码方案,使得Java在处理多语种的能力方面得到大大提高,从
而为Java程序在基于不同语种之间实现平滑移植铺平了道路。



4. Java有哪些运算符和表达式?请写出下面这些表达式的运算结果(设a =2,b = – 3,
f = true)。

1)– –a%b++ 2) (a>=1)&&a<=12?a:b) 3) f^(a>b) 4) (– –a)<



【答】:

Java的运算符主要由算术运算符、关系运算符、条件运算符、位运算符、逻辑运算符
以及赋值运算符。表达式由运算符、操作数和方法调用,按照语言的语法规则构造
而成的符号序列。

表达式的结构是:

1)– –a%b++的结果是:1

2)(a>=1)&&a<=12?a:b)的结果是:1

3)f^(a>b)的结果是:false

4)(– –a)<


5.Java中标准输入输出使用哪种系统类、使用哪个对象和方法?

【答】:

通过系统类https://www.doczj.com/doc/0510298717.html,ng.System达到访问标准输入输出的功能。System类管理标准输入输
出流和错误流,有以下三个对象:

1)System.out:把输出送到默认的显示(通常是显示器)。常使用输出的方法有print()、


println()等。

2)System.in:从标准输入获取输入(通常是键盘)。常实现输入处理的方法有read()、
skip()等;

3)System.err:把错误信息送到默认的显示。常见方法有print()、println()、write()等。



6.阅读下列程序,写出运行结果。

(1).

public class Example0401{

public static void main(String[] args){

for(int x=0;x<10;x++){

int y=x*x+x+41';

System.out.println("\t"+x+"\t"+y);

}

}

}

(2).菲波拉契数列:

public class Example02{

public static void main(String[] args){

System.out.print(0)

int fib0=0;

int fib1=1;

int fib2=fib0+fib1

while(fib2<100){

fib0=fib1;

fib1=fib2;

fib2=fib1+fib0;

System.out.print(","+fib1);

}

}

}

(3).产生0~20的随机整型,然后计算并打印它的结果:

import java.util.Random;

public class Example03{

public static void main(String[] args){

Random random=new Random();

float x=random.nextFloat();

int n=Math.round(21*x);

long f=1;

int k=1;

do

f*=k++;

while(k<=n);

System.out.println(n+"!="+f);

}


}

(4).三重循环:

public class Example05{

public static void main(String[] args){

for(int i=0;i<3;i++){

resume:

for(int j=0;j<3;j++){

for(int k=0;k<3;k++){

System.out.println("\n"+i+" "+j+' "+k);

if (i==1&& k==0) break resume;

}

System.out.println("\tEnd of k loop;j="+j);

}

System.out.println("\tEnd of j loop;i="+i);

}

System.o

ut.println("\tEnd of i loop.")

}

}

【答】:

(1)的运行结果如下:

0 41

1 43

2 47

3 53

4 61

5 71

6 83

7 97

8 113

9 131

(2)的运行结果如下:

0,1,2,3,5,8,13,21,34,55,89

(3)的运行结果如下:

运行结果取决于随机数。求随机数的阶乘,其中的一个运行结果如下:

3!=6

(4)的运行结果如下:



0 0 0



0 0 1



0 0 2

End of k loop;j=0




0 1 0



0 1 1



0 1 2

End of k loop;j=1



0 2 0



0 2 1



0 2 2

End of k loop;j=2

End of j loop;i=0



1 0 0

End of j loop;i=1



2 0 0



2 0 1



2 0 2

End of k loop;j=0



2 1 0



2 1 1



2 1 2

End of k loop;j=1



2 2 0



2 2 1



2 2 2

End of k loop;j=2

End of j loop;i=2

End of i loop.



7.分析下面两个三重循环程序之间的差别,写出结果,然后上机进行检验。

(1).三重循环1:

public class Example01{


public static void main(String[] args){

int count=0;

for(int i=0;i<3;i++)

resume:

for(int j=0;j<4;j++)

for(int k=0;k<5;k++){

++count;

if (i==1&&j==2&& k==3) break resume;

}

System.out.println("\tcount="+count);

}

}

(2).三重循环2:

public class Example02{

public static void main(String[] args){

int count=0;

for(int i=0;i<3;i++){

resume:

for(int j=0;j<4;j++)

for(int k=0;k<5;k++){

++count;

if (i==1&&j==2&& k==3) break resume;

}

System.out.println("\tcount="+count);

}

}

}。

【答】:

在三重循环1中,System.out.println()语句是在三重循环之外的,输出的是count的最后
的值,而三重循环2中,System.out.println()语句在循环体内,输出的是每次循环后count发
生变化的值。

三重循环1的运行结果是: count=54

三重循环2的运行结果是:

count=20

count=34

count=54


习 题 三

1.Java程序中字符串常量使用什么类表示?字符串变量又使用什么类来表示?它们的
主要区别在哪里?

【答】:

字符串常量常用https://www.doczj.com/doc/0510298717.html,ng.String类表示,字符串变量常用https://www.doczj.com/doc/0510298717.html,ng.StringBuffer类来表
示。它们的主要区别在于:String对象一旦创建不会发生变化,具有只读性质;而StringBuffer
对象创建后可扩充和修改字符串对象的内容。



2.请说明程序“String s1="I like ";s1+="Java!";”和程序“StringBuffer s1=new
StringBuffer("I like ");s1.append("Java!");”的区别。根据你得出的结论,如果程序需要处理
大量的字符串连接操作,应该尽量使用String类还是StringBuffer类?

【答】:

程序“String s1="I like ";s1+="Java!";”中,s1表示字符串变量

,在执行第一次运算时,
s1赋值一个字符串对象“I like ”,而第二次运算,s1被赋值另一个字符串对象“I like Java”,
二次运算中赋值的对象完全不同。而对于程序“StringBuffer s1=new StringBuffer("I like
");s1.append("Java!");”,变量s1在两次运算中始终表示一个字符串对象,只是这个字符串对
象的内容发生了变化。

程序在处理大量的字符串连接操作,尽量使用StringBuffer类的对象来处理。这是因为
StringBuffer对象可以扩充和修改字符串对象,有利于减少系统资源的消耗。



3.编写一个Applet,使之能将定长字符串转化成可变长字符串,并能实现字符串中指
定字符的替换。

【答】:

Applet的程序如下:

package javabook.answer.ch03;



import javax.swing.JApplet;

import java.awt.*;





public class Demo3 extends JApplet {

/**

* 字符串替换操作

*

*/

public void init() {

try {

str = this.getParameter("str");

strR = new StringBuffer(str);

pch = this.getParameter("ch1").charAt(0);

tch = this.getParameter("ch2").charAt(0);

} catch (Exception e) {

System.out.println("初始化数据出现错误!");

}

for (int i = 0; i < strR.length(); i++) {

if (strR.charAt(i) == pch) {// 替换

strR.setCharAt(i, tch);


}

}



}



public void paint(Graphics g) {

g.drawString("原来的字符串:" + str, 20, 20);

g.drawString("替换后的字符串:" + strR, 120, 120);

}



private String str;

private StringBuffer strR;

private char pch;

private char tch;

}

对应的HTML的文件如下:





关于字符串替换





















4.阅读下面的程序,写出程序的运行结果。

import java.util.*;

public class StringTest {

public static void main(String args[]){

String s1="I love Java.";

String s2="I like Java.";

String s3="I like Java.";



StringBuffer s4=new StringBuffer(s1);

StringBuffer s5=new StringBuffer("Append");

char c1[]=new char[s1.length()];



System.out.println("s1的长度="+s1.length());

System.out.println("s1和s2相同吗?"+(https://www.doczj.com/doc/0510298717.html,pareTo(s2)==0?"相同":"不同"));

System.out.println("s2和s3相同吗?"+(https://www.doczj.com/doc/0510298717.html,pareTo(s3)==0?"相同":"不同"));

System.out.println("s1连接s2后的字符串为:"+s1.concat(s2));

System.out.println(s1.startsWith("J",7));

System.out.println(s1.endsWith("."));

s1.getChars(0,s1.length(),c1, 0);

for(int i=0;i
System.out.println(c1[i]+" ");


}

System.out.print

ln(s1.toUpperCase()+"\n");

System.out.println("s4的长度="+s4.length());

System.out.println(s4.append(s5));

System.out.println(s4.insert(2,365.25f));

System.out.println(s4.insert(0,"INSERTED"));

char c2[]=new char[s4.length()];

s4.getChars(0, s4.length(), c2, 0);

for(int i=0;i
System.out.println(c2[i]+" ");

System.out.println(s4.toString().toUpperCase());

}

}

【答】:

上列程序StringTest的运行结果如下:

s1和s2相同吗?不同

s2和s3相同吗?相同

s1连接s2后的字符串为:I love Java.I like Java.

true

true

I



l

o

v

e



J

a

v

a

.

I LOVE JAVA.



s4的长度=12

I love Java.Append

I 365.25love Java.Append

INSERTEDI 365.25love Java.Append

I

N

S

E

R

T


E

D

I



3

6

5

.

2

5

l

o

v

e



J

a

v

a

.

A

p

p

e

n

d

INSERTEDI 365.25LOVE JAVA.APPEND

s1的长度=12




习 题 四

1. 写出类的格式声明中允许使用的关键字。它们代表的含义是什么?




【答】:

类的格式声明允许使用的关键字有:abstract、static、final、public、class、
implements以及extends等。abstract表示定义一个抽象类,static用于定义静态嵌套类、
final定义一个最终类,public定义一个公共类、class表示定义一个类、implements表示
定义的类实现的接口以及用extends表示该类继承某类。



2.类的成员数据的修饰符是否和类的成员方法部分相同,部分不同。请写出与成员方
法不同的修饰符是哪些?它们的含义是什么?

【答】:

类的成员数据修饰符有部分和成员方法相同,如访问控制符、static、final等。有部分
的修饰符存在不同。对于成员变量与成员方法不同的修饰符有:transient(说明变量不能被
序列化)、volatile(表示变量能从主存读取,进行异步修改);对于成员方法与成员变量不同
的修饰符有:native(定义本地方法)、abstract(定义抽象方法)、synchronized(定义同步方
法)。



3.写出构造方法的定义和用途?

【答】:

构造方法是一种特殊的方法,它与类名同名,但不具有返回值。构造方法由用户自定
义,如果没有定义系统会自动创建一个默认的无参构造方法。构造方法用于对象的创建和初
始化。



4.关键字static在修饰类、类的成员数据和类的成员方法中的作用各是什么?

【答】:

static在修饰类时,往往修饰类中定义的嵌套类,也称为静态嵌套类,提高了类的封装
性。static在修饰类的成员数据和成员方法时,表示定义一个静态成员,该成员为类成员,
为该类的所

有对象共享。



5.定义一个点类“Point”。Point类的属性有x轴和y轴坐标,可以通过方法setX()
设置x轴坐标,方法setY()设置y轴坐标,方法getY()获得x轴坐标,方法getY()
获得y轴坐标。编写一个测试类PointTest来创建Point类的对象,测试该类。

【答】:

package javabook.answer.ch04;



import java.util.*;



class Point {

private double x;

private double y;



public Point() {

x = 0;

y = 0;

}




public Point(double x, double y) {

setX(x);

setY(y);

}



public double getX() {

return x;

}



public void setX(double x) {

this.x = x;

}



public double getY() {

return y;

}



public void setY(double y) {

this.y = y;

}

}



public class EX5 {

public static void main(String args[]) {

Scanner in = new Scanner(System.in);

double x, y;

System.out.println("输入X坐标:");

x = in.nextDouble();

System.out.println("输入Y坐标:");

y = in.nextDouble();

Point p = new Point(x, y);

System.out.println("点的坐标:x=" + p.getX() + ",y=" + p.getY());

System.exit(0);

}

}



6.this关键字的含义是什么?它的主要用途有哪些?

【答】:

this关键字表示当前对象。它可以实现对对象成员的访问,可以实现在构造方法内调用
其他的构造方法来创建和初始化对象。



7.写出嵌套类的分类,并加以区分。

【答】:

嵌套类是在一个类内定义另外一个类。根据static的存在性分成两大类:静态嵌套类和
内部类。有static关键字为静态嵌套类,外部类的所有成员可以共享该静态嵌套类。无static
修饰的嵌套类为内部类。内部类必须与外部类的实例相关联,通过外部类的对象创建内部类
的对象实例。



8.编程定义一个队列类,它封装了队列数组,判断队列空方法、队列满方法、进队列
方法和出队列方法。

【答】:

队列类Queue的定义如下:

package javabook.answer.ch04;




public class EX8 {

private int length;// 队列长度;

private int[] s;// 队列数组;

private int top;// 队头;

private int rear;// 队尾;



public EX8(int length) {

this.length = length;

if (length > 0)

s = new int[length];// 初始化队列

top = rear = 0;// 队列空;

}



public int getTop() {// 获取队头元素;

if (!isEmpty()) {

return s[top];

}

return 0;

}



public int getRear() {// 获取队尾元素;

if (!isEmpty()) {

return s[rear];

}

return 0;

}



public void enQueue(int content) {// 进队列;

if (!isFull()) {

s[rear] = content;

rear = (rear + 1) % length;

}

}



public

void delQueue() {// 出队列

if (!isEmpty()) {

top = (top + 1) % length;

}

}



public boolean isFull() {// 判断队列满

if ((rear + 1) % length == top)

return true;

return false;

}



public boolean isEmpty() {// 判断队列空

if (rear == top)

return true;

return false;

}

}



9.编程定义一个栈类,它封装了栈数组,判断栈空方法、栈满方法以及进栈和出栈方
法。

【答】:


栈类Stack的定义如下列代码所示:

package javabook.answer.ch04;



public class EX9 {

private int length;

private int top;

private int[] s;



public EX9(int len) {// 初始化空栈

this.length = len;// 设置栈的空间大小

if (len > 0)

s = new int[len];

top = 0;// 设置为空栈

}



public int getTop() {// 获得栈顶元素

return s[top];

}



public boolean isFull() {// 判断栈满

if (top + 1 > length) {

return true;

}

return false;

}



public boolean isEmpty() {// 判断栈空

if (top < 1)

return true;

return false;

}



public void push(int content) {// 进栈

if (!isFull())

s[++top] = content;

}



public void pop() {// 出栈

if (!isEmpty()) {

--top;

}

}

}



10.编写一个类实现复数的运算。

【答】:

定义复数的类Complex,代码如下:

package javabook.answer.ch04;



public class EX10 {

private double real;

private double image;



public EX10(double real, double image) {

super();

this.real = real;


this.image = image;

}



public double getImage() {

return image;

}



public void setImage(double image) {

this.image = image;

}



public double getReal() {

return real;

}



public void setReal(double real) {

this.real = real;

}



public EX10 add(EX10 b) {// 复数相加

return new EX10(this.getReal() + b.getReal(), this.getImage()

+ b.getImage());

}



public EX10 sub(EX10 b) {// 复数相减

return new EX10(this.getReal() - b.getReal(), this.getImage()

- b.getImage());



}



public EX10 multiple(EX10 b) {// 复数相乘

double real, image;

real = this.getReal() * b.getReal() - this.getImage() * b.getImage();

image = this.getReal() * b.getImage() + this.getImage() * b.getReal();

return new EX10(real, image);

}



public EX10 div(EX10 b) {// 复数相除

double real, image, temp;

temp = Math.pow(b.getReal(), 2) + Math.pow(b.getImage(), 2);

real = (this.getReal() * b.getReal() + this.getImage() * b.getImage())

/ temp;

image = (this.getImage() * b.getReal() - this.getReal() * b.getImage())

/ temp;

return new EX10(real, image);

}



public static voi

d main(String args[]) {

EX10 a = new EX10(3, 4);

EX10 b = new EX10(3, -3);

EX10 result;

System.out.println("复数相加:");

result = a.add(b);

System.out.println("" + result.getReal() + "+i" + result.getImage());

System.out.println("复数相乘:");

result = a.multiple(b);

System.out.println("" + result.getReal() + "+i" + result.getImage());

System.exit(0);


}

}




习 题 五

1.子类将继承父类所有的属性和方法吗?为什么?在什么情况下会出现子类对父类变
量的隐藏?什么情况下出现子类对父类方法的覆盖?试举一例。

【答】:

子类继承父类的共有和保护类型的方法和属性,但是对于父类的私有方法和属性无法继
承。如果子类覆盖了父类的静态方法,父类的方法被隐藏。而覆盖是子类具有重新定义父类
成员方法的能力,例如:智能手机是手机的子类,手机可以打电话,而智能手机可以具有打
电话并增加传递视频信号的功能,重新定义手机打电话的功能。



2.方法的覆盖和方法的重载有什么不同?

【答】:

方法的覆盖是子类重新定义父类的成员方法,这意味着子类定义的方法具有和父类的方
法具有同方法名、同参数类型、同参数类型以及同返回值。而方法的重载是在同一个类中定
义同名方法的情况,这些同名方法除了方法名相同,但方法签名必须不同。



3.接口是什么?它将起何种作用?如何定义接口?如何使用接口?假设复数类实现了
一个四则运算的接口,试编程建立并使用这个接口?

【答】:

接口是为外界提供运算,并不提供运算的结构或具体的实现内容。接口是通过
interface来实现的,形如“interface 接口名”。实现复数四则运算的接口代码如下:

package javabook.answer.ch05;



interface ComplexCounter {

public abstract EX3 add(EX3 b);

public abstract EX3 sub(EX3 b);

public abstract EX3 div(EX3 b);

public abstract EX3 mul(EX3 b);

}



public class EX3 implements ComplexCounter {

private double real;

private double image;



public EX3(double real, double image) {

super();

this.real = real;

this.image = image;

}



public double getImage() {

return image;

}



public void setImage(double image) {

this.image = image;

}



public double getReal() {

return real;

}




public void setReal(double real) {

this.real = real;

}



public EX3 add(EX3 b) {// 复数相加

return new EX3(this.getReal() + b.getReal(), this.getImage()

+ b.getImage());

}



public EX3 sub(EX3 b) {// 复数相减

return new EX3(this.getReal() - b.getReal(), this.getImage()

- b.getImage());



}




public EX3 mul(EX3 b) {// 复数相乘

double real, image;

real = this.getReal() * b.getReal() - this.getImage() * b.getImage();

image = this.getReal() * b.getImage() + this.getImage() * b.getReal();

return new EX3(real, image);

}



public EX3 div(EX3 b) {// 复数相除

double real, image, temp;

temp = Math.pow(b.getReal(), 2) + Math.pow(b.getImage(), 2);

real = (this.getReal() * b.getReal() + this.getImage() * b.getImage())

/ temp;

image = (this.getImage() * b.getReal() - this.getReal() * b.getImage())

/ temp;

return new EX3(real, image);

}

}



4.计算

式1:y=x+x/2+x/3+……+x/n;

式2:y=x+x/2!+x/3!+……+x/n!;

要求:○1x为实数,n为正整数。 ○2任意输入n,当n为奇数时,按照式1计算,当n为偶
数时,按照式2计算。○3利用继承机制编程。

【答】:

MathCounter程序,实现式1运算如下:

package javabook.answer.ch05;



interface Counter {

public abstract double sum();



public abstract double div(double x, int n);

}



public class EX4a implements Counter {

private int n;

private double x;



public EX4a(double x, int n) {

this.n = n;


this.x = x;

}



public double sum() {

double result = 0;

if (n > 0)

for (int i = 1; i <= n; i++) {

result += div(x, i);

}

return result;

}



public double div(double x, int n) {

if (n != 0)

return x / n;

return 0;

}

}



FacMathCounter程序,实现式2的运算以及运算测试如下:

package javabook.answer.ch05;



import java.util.*;



public class EX4b extends EX4a {

private double x;

private int n;



public EX4b(double x, int n) {

super(x, n);

this.x = x;

this.n = n;

}



public double div(double x, int n) {

return x / fac(n);

}



public double fac(int n) {

int result = 1;

for (int i = 1; i <= n; i++)

result *= i;

return result;

}



public static void main(String args[]) {

Scanner in = new Scanner(System.in);

EX4a s;

System.out.println("输入实数:");

double xx = in.nextDouble();

System.out.println("输入整数:");

int nn = in.nextInt();

if (nn % 2 == 0)

s = new EX4b(xx, nn);

else

s = new EX4a(xx, nn);

System.out.println("运算结果是:" + s.sum());


System.exit(0);

}

}



5.编程通过继承线性表实现栈数据结构以及操作。

【答】:

线性表LineList类的定义如下:

package javabook.answer.ch05;



public class EX5LineList {

char[] list;

int cur;// 当前元素



public EX5LineList(char[] list) {

this.list = list;

cur = 0;

}



public void destroyList() {// 销毁线性表

this.list = null;

cur = -1;



}



public int getLength() {// 获取线性表的长度

return this.list.length;

}



public char getElement(int index) {// 获取指定位置的元素

if (index < getLength() && index >= 0)

return list[index];

return 0;

}



public int getLocation(char c) {// 获取指定元素的位置

for (int i = 0; i < list.length; i++)

if (c == list[i])

return i;

return -1;

}



public char getPriorContent() {// 获取前驱

if (cur > 0 && cur < list.length)

return list[cur - 1];

return 0;

}



public char getNextContent() {// 获取后继

if (cur >= 0 && cur < list.length - 1)

return list[cur + 1];

return 0;

}



public boolean insert(char c) {// 插入元素

if (++cur < list.length) {

list[cur] = c;

return true;


}

return false;

}



public boolean delete(int index) {// 删除第index元素

if (index <= cur && index >= 0) {

for (int i = index; i <= cur; i++)

list[i] = list[i + 1];

return true;

}

return false;

}

}

继承线性表LineList的栈Stack类的定义如下:

package javabook.answer.ch05;



public class EX5Stack extends EX5LineList {

char[] list;

int top;



public EX5Stack(char[] list) {

super(list);

this.list = list;

top = 0;

}



public void push(char c) {

if (insert(c))

top++;

}



public void pop() {

if (delete(top))

top--;

}



public char getTop() {

return getElement(top);

}

}



6.利用接口编写三角形、梯形面积及周长的程序。

【答】:

package javabook.answer.ch05;



import java.util.*;



interface TriInf {

public abstract double area();



public abstract double perimeter();

}



public class EX6 implements TriInf {

double a = 0, b = 0, c = 0;// 定义三边长;




public EX6(double a, double b, double c) {

this.a = a;

this.b = b;

this.c = c;

}



public double area() {

double d = (a + b + c) / 2;

return Math.sqrt(d * (d - a) * (d - b) * (d - c));

}



public double perimeter() {

return a + b + c;

}



public static void main(String args[]) {

Scanner in = new Scanner(System.in);

double aa, bb, cc;

System.out.println("输入三角形三边:");

aa = in.nextDouble();

bb = in.nextDouble();

cc = in.nextDouble();

EX6 t = new EX6(aa, bb, cc);

System.out.println("三角形的面积=" + t.area() + ",三角形的周长=" + t.perimeter());

System.exit(0);

}

}




习题六

1. 如何创建一个List或Set对象?使用它们存放数据时哪种对象不能存放重复元素?




【答】:

可以使用关键字new调用相应构造函数创建List或Set对象。

(1)要创建Lis

t对象时可使用以下方法:List list = new ArrayList();或 ArrayList
arraylist = new ArrayList();或 LinkedList linkedlist = new LinkedList();等等。

(2)要创建Set对象则调用相应的构造函数:HashSet hashset = new HashSet(); 等。

Set定义的集合中不能包含相同的元素。



2. 列举几种可以遍历集合对象中元素的方法。




【答】:

可以使用Iterator接口定义的方法来遍历类集,或直接使用循环语句来对集合中对象进
行遍历。



3. 如何向一个HashMap对象中添加元素?




【答】:

通过调用Map接口中定义好的put()方法可以该对象中添加相应的元素,该方法原型
为Object put(Object key, Object value)。

如若已经建立了一个HashMap对象hashmap,则可使用hashmap.put(“关键字”,“元素
值”)来向hashmap对象添加元素及该元素的值。



4. 使用本章介绍的一种集合类型编写程序,实现从控制台任意输入若干名字,如Mike、
Jone、Benny……,将它们以字典序按升序方式输出。




【答】:

package javabook.answer.ch06;

import java.util.*;

import java.io.*;

public class ch6exe4 {

public static void main(String[] args) throws IOException{

List list=new ArrayList();

System.out.println("请输入若干学生姓名(输入'exit'则终止输入):");

BufferedReader buf = new BufferedReader (new InputStreamReader(System.in));

String str = buf.readLine();

while(!str.equals("exit")){

list.add(str);

str = buf.readLine();

}

buf.close();

Collections.sort(list);

System.out.println("您输入的学生有(按字典序排列):");

Iterator i=list.iterator();

while(i.hasNext()){

String t=(String)i.next();

System.out.println(t);

}

}

}



5. 从下面文本中计算单词“Java”、“language”、“simple”的出现次数,并按次数从





大到小输出结果。文本内容为:




Java is certainly a good programming language. Java was never just a language.
Java is a whole platform. Java has a lot of nice language features. Java 2D was
designed so that simple operations are simple and complex operations are feasible.

【答】:

package javabook.answer.ch06;

import java.util.*;

public class ch6exe5 {

public static void main(String[] args){

String text="Java is certainly a good programming language. "+

"Java was never just a language. Java is a whole platform. "+

"Java has a lot of nice language features. "+

"Java 2D was designed so that simple operations are simple and complex operations are feasible.";



int count=0;

int flag[]={0,0,0};

Map hashMap=new HashMap();

StringTokenizer st=new StringTokenizer(text,". ");

String key[]={"Java","language","simple"};

whi

le(st.hasMoreTokens()){

String k=st.nextToken();

for(int i=0;i<3;i++){

if(k.equals(key[i])){

flag[i]=1;

if(hashMap.get(k)!=null){

count=((Integer)hashMap.get(k)).intValue();

count++;

hashMap.put(k, new Integer(count));

}

else{

hashMap.put(k, new Integer(1));

}

}

}

}

for(int i=0;i<3;i++){

if(flag[i]==0)

hashMap.put(key[i], new Integer(0));

}

Map map=new TreeMap(hashMap);

Set set=map.entrySet();

Iterator iterator=set.iterator();

System.out.println("待统计的文本为:");

System.out.println(text);

System.out.println("以下为要统计的单词及出现的次数(按次数从高到低排列):");

while(iterator.hasNext()){

System.out.println(iterator.next());

}

}

}



6. 编写程序实现对任意消息窗口中输入的整数,输出该整数的所有因子。请使用Stack
类来存放因子,并在程序中使用本章中介绍的泛型指定Stack对象存储的元素类型。




【答】:

package javabook.answer.ch06;


import java.util.*;

import javax.swing.JOptionPane;

public class ch6exe6 {

public static void main(String[] args){

Stack stack=new Stack();

String s;

s=JOptionPane.showInputDialog("请输入一个整数:");

int n=Integer.parseInt(s);

for(int i=1;i<=n;i++){

if(n%i==0)

stack.push(i);

}

String str="整数"+s+"的因子有:\n";

while(!stack.empty()){

int i=stack.pop();

str+=i+"\n";

}

JOptionPane.showMessageDialog(null,str,"显示输入整数的因子
",https://www.doczj.com/doc/0510298717.html,RMATION_MESSAGE);

}

}

}



7. 编写一个Applet,显示当前日期和时间。显示的文字颜色、字体、大小均在HTML
文件中定义。




提示:可以使用java.util包中的Calendar类,该类提供了年、月、日、小时、分、秒等
信息,可以使用int get(int calendarField)方法来返回由参数calendarField指定的分量值,如
若实参为Calendar.YEAR,则该方法将返回当前的年份。因此可通过calendarField指定的分
量Calendar.YEAR、Calendar.MONTH、Calendar.DATE、Calendar.HOUR、Calendar.MINUTE
和Calendar.SECOND调用get()方法来取得当前的日期和时间。

【答】:














code = " javabook/answer/ch06/ch6exe7.class"

width = "400"

height = "100"

>























//题7程序源代码ch6exe7.java

package javabo

ok.answer.ch06;


import java.awt.*;

import java.applet.*;

import java.util.*;

import java.text.*;



public class ch6exe7 extends Applet {



String msg,font,nowdate,nowtime;

int x,y,fontcolor,size;

public void init() {

msg = getParameter("message");

x = Integer.parseInt(getParameter("X_Position"));

y = Integer.parseInt(getParameter("Y_Position"));

fontcolor = Integer.parseInt(getParameter("fontcolor"),16);

font = getParameter("font");

size = Integer.parseInt(getParameter("size"));



SimpleDateFormat fomatter1=new SimpleDateFormat("yyyy-MM-dd");

SimpleDateFormat fomatter2=new SimpleDateFormat("hh:mm:ss");

Date date=new Date();

nowdate=fomatter1.format(date);

nowtime=fomatter2.format(date);

}



public void paint(Graphics g) {

Font f = new Font(font,Font.BOLD,size);

g.setFont(f);

g.setColor(new Color(fontcolor));

g.drawString("Today is: "+nowdate,50,40);

g.drawString("Now the time is: "+nowtime,50,70);

}

}




习题七

1. 什么是图形上下文,在Java2和Java2D中,如何实现对图形上下文的管理?




【答】:

图形上下文有时也称为图形环境,指允许用户在屏幕绘制图形的信息,它由Graphics
类封装,可以通过Component类的getGraphics()方法返回获得。图形上下文表示一个绘
制图层,如组件的显示区、打印机上的一页、或一个屏幕外图像缓冲区。它提供了绘制三种
图形对象的方法:形状、文本和图像。

在Java中,可以通过Graphics的对象对图形上下文进行管理。



2. Graphics2D的属性有哪些,分别实现什么功能?




【答】:

Graphics 2D对象有6种属性,包括paint、stroke、font、transform、clip和composite。

(1)paint——该属性确定所绘制线条的颜色,以及填充图形的颜色和图案等。

(2)stroke——该属性可以确定线条的类型以及粗细,还有线段端点的形状。

(3)font——该属性可以确定所显示字符串的字体。

(4)transform——该属性确定了图形绘制过程中要应用的转换方法,通过指定转换方
法可将所画内容进行平移、旋转和缩放

(5)clip——该属性定义了组件上某区域的边界。

(6)composite——该属性定义了如何绘制重叠的几何图形,使用合成规则可以确定重
叠区域的显示效果。



3. 编写程序,使用柱形显示以下信息:90~100:10人(用蓝色矩形表示),80~90:
20人(用灰色矩形表示),70~80:40人(用绿色矩形表示),60~70:20人(用橙色矩形
表示),60以下:10人(用红色矩形表示)。程序结果如图7-18所示。






图7-18 第3题程序显示结果

【答】:

package javabook.answer.ch07;

import java.awt.*;

i

mport java.awt.geom.*;

import javax.swing.*;



public class ch7exe3 extends JFrame{

public ch7exe3() {

super();

setTitle("Exercise 7.3");

setSize(500,300);


setVisible(true);

}

public void paint(Graphics g) {

Graphics2D g2 = (Graphics2D) g;



Line2D l = new Line2D.Double(50,250,450,250);

g2.draw(l);



Rectangle2D r1 = new Rectangle2D.Double(100,200,60,50);

g2.setColor(Color.blue);

g2.fill(r1);



Rectangle2D r2 = new Rectangle2D.Double(160,150,60,100);

g2.setColor(Color.gray);

g2.fill(r2);



Rectangle2D r3 = new Rectangle2D.Double(220,50,60,200);

g2.setColor(Color.green);

g2.fill(r3);



Rectangle2D r4 = new Rectangle2D.Double(280,150,60,100);

g2.setColor(Color.orange);

g2.fill(r4);



Rectangle2D r5 = new Rectangle2D.Double(340,200,60,50);

g2.setColor(Color.red);

g2.fill(r5);



g2.setColor(Color.black);

g2.drawString("90~100",105,270);

g2.drawString("10人",115,190);

g2.drawString("80~90",170,270);

g2.drawString("20人",175,140);

g2.drawString("70~80",230,270);

g2.drawString("40人",235,40);

g2.drawString("60~70",290,270);

g2.drawString("20人",295,140);

g2.drawString("60以下",350,270);

g2.drawString("10人",355,190);

}

public static void main(String[] args) {

ch7exe3 e = new ch7exe3();

e.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

}




4. 编写程序,使用扇形图显示以下信息:90~100:10%,80~90:20%,70~80:40%,60~70:20%,60以下:10%。程序结果如图7-19所示。






图7-19第4题程序显示结果

【答】:

package javabook.answer.ch07;

import java.awt.*;

import java.awt.geom.*;

import javax.swing.*;



public class ch7exe4 extends JFrame{

public ch7exe4() {

super();

setTitle("Exercise 7.4");

setSize(300,300);

setVisible(true);

}

public void paint(Graphics g) {

Graphics2D g2 = (Graphics2D) g;



int x = getWidth()/2;

int y = getHeight()/2;



Arc2D r1 = new Arc2D.Double(x-120,y-120,240,240,0,36,Arc2D.PIE);

g2.setColor(Color.magenta);

g2.fill(r1);



Arc2D r2 = new Arc2D.Double(x-120,y-120,240,240,36,72,Arc2D.PIE);

g2.setColor(Color.LIGHT_GRAY);

g2.fill(r2);



Arc2D r3 = new Arc2D.Double(x-120,y-120,240,240,108,144,Arc2D.PIE);

g2.setColor(Color.green);

g2.fill(r3);



Arc2D r4 = new Arc2D.Double(x-120,y-120,240,240,252,72,Arc2D.PIE);

g2.setColor(Color.orange);

g2.fill(r4);



Arc2D r5 = new Arc2D.Double(x-120,y-120,240,240,324,36,Arc2D.PIE);

g2.setColor(Color.red);

g2.fill(r5);



g2.setColor(Color.black);

g2.drawString("90~100:10%",200,135);


g2.drawString("80~90:20%",150,80);

g2.drawString("70~80:40%",50,145);

g2.draw

String("60~70:20%",150,230);

g2.drawString("60以下:10%",200,175);

}

public static void main(String[] args) {

ch7exe4 e = new ch7exe4();

e.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

}



5. 使用Graphics2D绘制静止时钟的钟面,要求绘制出整点刻度以及时钟的时针和分针
且时钟显示为3点30分。




【答】:

package javabook.answer.ch07;

import java.awt.*;

import javax.swing.*;



public class ch7exe5 extends JFrame{

public ch7exe5() {

super();

setTitle("Ch7 Exercise 5");

setSize(300,200);

setVisible(true);

}

public void paint(Graphics g) {

Graphics2D g2 = (Graphics2D) g;



int x=150,y=100,radius=70;

g2.drawOval(80, 30, 140, 140);

g2.drawString("12", 145, 42);

g2.drawString("11", (int)(x-radius*Math.cos(2*Math.PI/6)),
(int)(y-radius*Math.sin(2*Math.PI/6)+10));

g2.drawString("10", (int)(x-radius*Math.cos(Math.PI/6)), (int)(y-radius*Math.sin(Math.PI/6))+10);

g2.drawString("9", 83, 105);

g2.drawString("8", (int)(x-radius*Math.cos(Math.PI/6)+5), (int)(y+radius*Math.sin(Math.PI/6)));

g2.drawString("7", (int)(x-radius*Math.cos(2*Math.PI/6)), (int)(y+radius*Math.sin(2*Math.PI/6)));

g2.drawString("6", 147, 167);

g2.drawString("5", (int)(x+radius*Math.cos(2*Math.PI/6)-10),
(int)(y+radius*Math.sin(2*Math.PI/6)));

g2.drawString("4", (int)(x+radius*Math.cos(Math.PI/6)-10), (int)(y+radius*Math.sin(Math.PI/6)));

g2.drawString("3", 210, 103);

g2.drawString("2", (int)(x+radius*Math.cos(Math.PI/6)-10), (int)(y-radius*Math.sin(Math.PI/6)+10));

g2.drawString("1", (int)(x+radius*Math.cos(2*Math.PI/6)-10),
(int)(y-radius*Math.sin(2*Math.PI/6))+10);



int ml=45;

int xm=(int)(x+ml*Math.sin(30*2*Math.PI/60));

int ym=(int)(y-ml*Math.cos(30*2*Math.PI/60));

g2.drawLine(x, y, xm, ym);



int hl=35;

int xh=(int)(x+hl*Math.sin(3.5*2*Math.PI/12));

int yh=(int)(y-hl*Math.cos(3.5*2*Math.PI/12));

g2.drawLine(x, y, xh, yh);

}




public static void main(String[] args) {

ch7exe5 c = new ch7exe5();

c.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

}



6. 使用Graphics2D绘制一个立方体和六边形,并使用渐变填充方式填充立方体,使用
纹理填充方式填充六边形,且六边形的外边框轮廓宽度为5




【答】:

package javabook.answer.ch07;

import java.awt.*;

import java.awt.geom.*;

import java.awt.image.BufferedImage;

import javax.swing.*;



public class ch7exe6 extends JFrame{

public ch7exe6() {

super();

setTitle("Ch7 Exercise 6");

setSize(300,200);

setVisible(true);

}

public void paint(Graphics g) {

Graphics2D g2 = (Graphics2D) g;



Rectangle2D r = new Rectangle2D.Float(20, 80, 100, 100);

g2.draw(r);



GeneralPath path1 = new GeneralP

ath();

path1.moveTo(20, 80);

path1.lineTo(40, 45);

path1.lineTo(140, 45);

path1.lineTo(120, 80);

path1.lineTo(20, 80);

g2.draw(path1);



GeneralPath path2 = new GeneralPath();

path2.moveTo(120, 80);

path2.lineTo(120, 180);

path2.lineTo(140, 145);

path2.lineTo(140, 45);

path2.lineTo(120, 80);

g2.draw(path2);



Point2D p1 = new Point2D.Double(20,80);

Point2D p2 = new Point2D.Double(70,130);

GradientPaint gp = new GradientPaint(p1, Color.white, p2, Color.black, true);

g2.setPaint(gp);

g2.fill(r);



p1 = new Point2D.Double(20,80);

p2 = new Point2D.Double(80,60);

gp = new GradientPaint(p1, Color.white, p2, Color.black, true);

g2.setPaint(gp);

g2.fill(path1);




p1 = new Point2D.Double(140,45);

p2 = new Point2D.Double(130,112.5);

gp = new GradientPaint(p1, Color.white, p2, Color.black, true);

g2.setPaint(gp);

g2.fill(path2);



GeneralPath path3 = new GeneralPath();

path3.moveTo(290, 100);

path3.lineTo((230+60*Math.cos(2*Math.PI/6)), (100-60*Math.sin(2*Math.PI/6)));

path3.lineTo((230+60*Math.cos(2*2*Math.PI/6)), (100-60*Math.sin(2*2*Math.PI/6)));

path3.lineTo((230+60*Math.cos(3*2*Math.PI/6)), (100-60*Math.sin(3*2*Math.PI/6)));

path3.lineTo((230+60*Math.cos(4*2*Math.PI/6)), (100-60*Math.sin(4*2*Math.PI/6)));

path3.lineTo((230+60*Math.cos(5*2*Math.PI/6)), (100-60*Math.sin(5*2*Math.PI/6)));

path3.lineTo(290, 100);

Stroke stroke = new BasicStroke(5.0f);

g2.setStroke(stroke);

g2.setColor(Color.black);

g2.draw(path3);



BufferedImage image=new BufferedImage(10,10,BufferedImage.TYPE_INT_RGB);

Graphics2D bg = image.createGraphics();

bg.setColor(Color.yellow);

bg.fillOval(0,0,5,5);

bg.setColor(Color.red);

bg.fillOval(0,5,5,5);

bg.setColor(Color.green);

bg.fillOval(5,0,5,5);

bg.setColor(Color.blue);

bg.fillOval(5,5,5,5);



Rectangle2D r1 = new Rectangle2D.Double(0,0,10,10);

TexturePaint tp = new TexturePaint(image,r1);

g2.setPaint(tp);

g2.fill(path3);

}



public static void main(String[] args) {

ch7exe6 c = new ch7exe6();

c.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

}




习 题 八

1.AWT包的GUI组件和Swing包的GUI组件有哪些不同?

【答】:

Swing包和AWT包的GUI具有类似的组件,不同之处在于:与AWT的GUI组件相比,
Swing是轻量级元件。SWING 提供许多比AWT更好的屏幕显示元素。它们用纯Java写成,
所以同Java本身一样可以跨平台运行。



2.什么是重量级组件?什么是轻量级组件?二者的区别是什么?

【答】:

依靠本地方法实现功能的组件称为重量级组件,而反之为轻量级的组件。二者的区别
判断的依据是否是依赖本地方法。



3.什么是MVC模式?请举

例说明。

【答】:

MVC是一种设计模式,M表示Model,说明业务模型,也就是组件的状态和行为,V
表示View视图,处理用户界面的显示;C表示Controller控制器,用来控制用户输入。例
如:javax.swing.JButton的组件实例中,一个JButton按钮组件中Model说明了该按钮的状
态、操作内部状态、添加删除监听事件、发生的事件;按钮的视图和控制器由一个接口
ButtonUI完成。如果一个类实现了这个接口,那么它将会负责创建一个用户界面,处理用户
的操作。涉及的方法可以被分为三大类:绘制Paint、返回几何类型的信息和处理事件。



4.编写一个Java程序,实现用户密码输入界面。

【答】:

实现用户密码输入的界面见下列程序。

package javabook.answer.ch08;



import javax.swing.*;

import java.awt.*;



public class EX4 extends JFrame {

JLabel userLabel;

JTextField userText;

JLabel passwordLabel;

JPasswordField password;

JButton confirmBtn;



public EX4() {

super("密码输入");

userLabel = new JLabel("用户名:");

passwordLabel = new JLabel("密码:");

userText = new JTextField(10);

password = new JPasswordField(10);

confirmBtn = new JButton("确认");

Container container = getContentPane();

container.setLayout(new FlowLayout());

container.add(userLabel);

container.add(userText);

container.add(passwordLabel);

container.add(password);


container.add(confirmBtn);

pack();



setVisible(true);

try {

UIManager

.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");

SwingUtilities.updateComponentTreeUI(this);

} catch (Exception e) {

JOptionPane.showMessageDialog(null, this);

}

}



public static void main(String args[]) {

EX4 cpf = new EX4();

cpf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

}



5.编写一个Java程序Counter.java,实现一个计算机器的图形界面。

【答】:

Counter.java的程序见下列代码:

package javabook.answer.ch08;



import java.awt.*;

import javax.swing.*;



public class EX5 extends JFrame {

private Container container;

private GridBagLayout layout;

private GridBagConstraints constraints;

private JTextField displayField;// 计算结果显示区



public EX5() {// 构造方法,定义所有GUI组件

super("Counter");

container = getContentPane();

layout = new GridBagLayout();

container.setLayout(layout);

constraints = new GridBagConstraints();

displayField = new JTextField(20);

displayField.setHorizontalAlignment(JTextField.RIGHT);

constraints.gridx = 0;

constraints.gridy = 0;

constraints.gridwidth = 4;

constraints.gridheight = 1;

constraints.fill = GridBagCons

traints.BOTH;

constraints.weightx = 100;

constraints.weighty = 100;

layout.setConstraints(displayField, constraints);

container.add(displayField);

addButton("Backspace", 0, 1, 2, 1);

addButton("CE", 2, 1, 1, 1);

addButton("C", 3, 1, 1, 1);

addButton("7", 0, 2, 1, 1);

addButton("8", 1, 2, 1, 1);

addButton("9", 2, 2, 1, 1);


addButton("/", 3, 2, 1, 1);

addButton("4", 0, 3, 1, 1);

addButton("5", 1, 3, 1, 1);

addButton("6", 2, 3, 1, 1);

addButton("*", 3, 3, 1, 1);

addButton("1", 0, 4, 1, 1);

addButton("2", 1, 4, 1, 1);

addButton("3", 2, 4, 1, 1);

addButton("-", 3, 4, 1, 1);

addButton("0", 0, 5, 1, 1);

addButton(" /-", 1, 5, 1, 1);

addButton(".", 2, 5, 1, 1);

addButton(" ", 3, 5, 1, 1);

addButton("=", 0, 6, 4, 1);

setSize(300, 300);

setVisible(true);

}



private void addButton(String label, int row, int column, int with,

int height) {// 定义按钮

JButton button = new JButton(label);

constraints.gridx = row;

constraints.gridy = column;

constraints.gridwidth = with;

constraints.gridheight = height;

constraints.fill = GridBagConstraints.BOTH;

layout.setConstraints(button, constraints);

container.add(button);

}



public static void main(String[] args) {// 主程序

EX5 Counter = new EX5();

Counter.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

}



6.编写一个Java程序FileMenu.java,设计一个简易文件管理菜单。菜单有文件、编辑
和帮助3项。其中文件菜单项有以下子菜单项:新建、打开、关闭、退出;编辑菜单项有以
下菜单项;复制、粘贴、查找、替换、定位;帮助菜单项有以下子菜单项:拥护帮助、版本
说明,采用windows操作系统的外观。

【答】:

FileMenu.java的源程序清单见下列代码:

package javabook.answer.ch08;



import javax.swing.*;



public class EX6 extends JFrame {



public EX6() {

super("文件简易菜单");

defineMenu();

setJMenuBar(menuBar);

setVisible(true);

setSize(400, 300);

}




private void defineMenu() {

menuBar = new JMenuBar();

menuBar.setToolTipText("FMS文件处理系统1.0");



fileMenu = new JMenu("文件(F)");// 定义文件菜单

fileMenu.setMnemonic('F');

newItem = new JMenuItem("新建");

openItem = new JMenuItem("打开");

closeItem = new JMenuItem("关闭");

exitItem = new JMenuItem("退出");

fileMenu.add(newItem);

fileMenu.add(openItem);

fileMenu.add(closeItem);

fileMenu.add(exitItem);



editMenu = new JMenu("编辑(E)");

editMenu.setMnemonic('E');

copyItem = new JMenuItem("复制");

pasteItem = new JMenuItem("粘贴");

searchItem = new JMenuItem("查找");

replaceItem = new JMenuItem("替换");

locateItem =

new JMenuItem("定位");

editMenu.add(copyItem);

editMenu.add(pasteItem);

editMenu.add(searchItem);

editMenu.add(replaceItem);

editMenu.add(locateItem);



helpMenu = new JMenu("帮助(H)");

helpMenu.setMnemonic('H');

userHelpItem = new JMenuItem("帮助");

versionItem = new JMenuItem("版本");

helpMenu.add(userHelpItem);

helpMenu.add(versionItem);



menuBar.add(fileMenu);

menuBar.add(editMenu);

menuBar.add(helpMenu);

}



public static void main(String args[]) {

EX6 fm = new EX6();

fm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}



private JMenuBar menuBar;// 主菜单条



private JMenu fileMenu; // 文件菜单

private JMenu editMenu; // 编辑菜单

private JMenu helpMenu; // 系统帮助菜单



private JMenuItem newItem;// 文件新建;

private JMenuItem openItem;// 文件打开;

private JMenuItem closeItem;// 文件关闭;

private JMenuItem exitItem;// 文件退出;



private JMenuItem copyItem;// 文件复制;

private JMenuItem pasteItem;// 文件粘贴;


private JMenuItem searchItem;// 文件查找;

private JMenuItem replaceItem;// 文件替换;

private JMenuItem locateItem;// 文件定位;



private JMenuItem userHelpItem;// 用户帮助;

private JMenuItem versionItem;// 版本说明;

}




习 题 九

1.什么是代理事件处理模型?请举例说明。

【答】:

Java语言采用基于代理的事件处理模型。基于代理事件处理模型是引进了监听器接口,
每个事件类都有相关联的监听器接口。当用户对GUI组件有所动作,GUI组件会自动产生
相应的事件来响应用户的动作。假设这些GUI组件已经注册了相关的监听器对象,监听器
对象会一直监听已注册的组件对象是否有事件发生。当监听器对象监听到组件有相对应的事
件发生,就会调用监听器对象中方法,即事件处理器来实现一定的动作。就这样,通过对目
标监听器对象的相关Java方法调用,实现事件从事件源到监听者的传递。



2.常见的事件处理方式有哪几种?请比较各种方式的特点?

【答】:

有通过(1)实现监听器接口来处理事件、(2)利用独立监听器类实现事件处理、(3)
利用内部类实现事件处理、以及(4)利用匿名内部类实现事件处理四种事件处理方式。

方法(1)可直接对监听器接口的方法进行处理和调用,并且应用简单方便。但是,这
种方式存在一个问题,由于实现接口的方法和定义类的方法处于平行定义,如果要求对多个
组件有不同的处理,这种方法无疑会增加阅读程序的困难。

方法(2)事件处理的方式优点在于,处理事件的方法清晰明了,可读性强。另外

相关主题
文本预览
相关文档 最新文档