java程序设计实用教程(第3版) 叶核亚 习题答案 所有答案1—12章 下载本文

第1章

1.Java具有那些适合在Internet环境中的特点?

【答】简单性和完全面向对象,平台无关性,安全性和可靠性,多线程,高效的网络编程。

2.Java保留、放弃了C/C++语言中哪些语法和面向对象机制?为什么需要这样做?

【答】 在语法规则方面,Java语言放弃了全程变量、goto语句、宏定义、全局函数以及结构、联合和指针数据类型,使Java语言更简单、更精练。

在面向对象概念方面,Java语言放弃了多元继承、友元类和运算符重载,采用“单重继承+接口”的方式代替多重继承,提供语言级的内存自动管理和异常处理方式,使Java语言更健壮、更安全、更高效。

3.Java对原程序文件的命名规则有什么要求?源程序文件编译后生成什么文件?

【答】 要求:源程序文件与类同名,文件扩展名为.java;编译后生成字节码文件(*.class)。

4.Java程序的运行机制是怎样的?与C++或其他语言有什么不同? 【答】Java的每一个类都有一个class文件和它对应,Java在程序的启动的时候将程序运行需要用到的类加载到虚拟机中,根据Java的虚拟机规范进行连接(动态连接),程序的组装是在运行的时候完成的

C++和其他的编译型的语言一样,它的程序的组装方式是一种传统的组装方式。C++在编译的时候生成适用于某一平台的二进制代码,在连接的时候找到需要调用的库,然后将这些库中的代码连接进可执行程序之中,生成的可执行程序运行速度非常的快,但是可执行代码已经变成了一个整体,不可能再分开

5.什么是平台无关性?Java是怎样实现平台无关性的?

【答】平台无关性即Java程序的运行不依赖于操作系统。Java采用虚拟机技术实现平台无关性。程序由虚拟机解释执行,不同的操作系统上运行不同版本的Java虚拟机。

6.Java应用程序由哪两种形式?他们的运行方式有什么不同?

【答】Application和applet两种形式,其中application是能够独立运行的应用程序,既可以以DOS的命令方式运行,也可以以图形用户界面方式运行。Applet是可以嵌入页面的最小应用程序,不能独立运行,必须嵌入超文本中,由浏览器 显示运行。

7.什么是解释执行?Java怎样解释执行两种应用程序? 【答】解释执行即将字节码解释成本地机器码并执行。 Java源程序文件经编译后生成字节码文件,若是application应用程序,则将字节码文件交由Java解释器解释执行,最后在windows操作系统上运行。若是applet应用程序,则将字节码文件嵌入超文本文件并下载到web浏览器上,最后由windows操作系统中的Java虚拟机运行。

8.作为一个软件开发人员,应该具备那些基础知识用以开发windows应用程序? 【答】略

第2章

1.标示符和关键字在定义和使用方面有何区别?

【答】定义方面:标示符是用户定义的、以字母开头的字母数字序列,关键字是由Java语言定义的、具有特定含义的英文单词。

使用方面:标示符用于命名变量、常量、类、对象等元素,每一个关键字都有特定的含义,不能被赋予别的含义。

2.Java语言的基本数据类型有哪些?引用数据类型有哪些?

【答】基本数据类型有:整数类型byte、short、int、long,浮点数类型float、double,字符

类型char,布尔类型boolean;引用数据类型包括数组(array)、类(class)和接口(interface)

3.试分析基本数据类型与引用数据类型的主要特点,并说明使用这两种变量有哪些差别?【答】基本数据类型的变量保存数据值,而引用数据类型的变量保存地址。

4.算术运算、关系运算、逻辑运算和位运算各有哪些运算符? 【答】算术运算:单目运算符有+(正)、—(负)、++(自增)、——(自减),双目运算符有+(加)、—(减)、*(乘)、/(除)、%(取余)

关系运算:=(等于)、!=(不等于)、>(大于)、<(小于)、>=(大于等于)、<=(小于等于)都是双目运算

逻辑运算:&(与)、|(或)、!(非)、^(异或)、&&(条件与)、||(条件或),其中!是单目运算,其它都是双目运算

位运算:~(非)、&(与)、|(或)、^(异或)、<<(左移位)、>>(右移位)、>>>(无符号移位)

5.程序中为什么需要常量和变量?声明常量或变量时,为什么必须给出其所属的数据类型? 【答】在程序中使用的数据大多需要经常变化,用常量值表示显然不够,因此每一种算法语言都提供常量和变量来存储数据。

为了确定常量或变量的数据性质、取值范围、以及它们占用的内存单元的字节数和它们参加的合法运算和操作。

6.什么是变量的作用域,声明变量时,如何确定变量的作用域?

【答】 变量的作用域是指其作用范围。变量声明的位置决定了它的作用域

7.设i是一个整数类型变量,写出下列问题对应的表达式? (1) 判断i为奇数或偶数;

【答】i%2==0 //取值为true时是偶数,否则是奇数

(2) 判断i的值是否在0~9之间;

【答】(i>0)&&(i<9)

8.设ch是一个字符变量,写出下列问题对应的表达式 (1) 判断ch是一个十进制的数字字符

(2) (3) (4) (5) (6) 判断ch是一个十六进制的数字字符 判断ch是一个大写字母

判断ch是一个英文字母,不论大写和小写

如何将一个十进制的数字字符ch转换成对应的整数类型值 如何将一个十六进制的数字字符ch转换成对应的整数类型值

9.说明for、while、和do-while三种循环语句的特点和区别?

While语句的特点:“先判断后执行”,当条件满足时执行循环体 Do-while语句的特点:“先执行后判断”,先执行循环体,再判断条件是否满足 For语句的特点:“先判断后执行”,但for语句将循环控制变量初始值、循环条件和变量的变化规律都以表达式形式写在循环体之前。

10.分别用for,while,do-while三种循环语句计算一个正数的阶乘

(1)for(i=1,i<=10,i++){

int Sum=1;

Sum=Sum*i;} \\\\等价于Sum*=i; (2)int i=1; while(i<=10){ int Sum=1; Sum=Sum*i; i++;}

int i=Sum=1; do{

Sum=Sum*i;

i++;}while(i<=10);

11.输出以下数字的形式; (1) 0 0 0 0

0 1 1 1 0 1 2 2 0 1 2 3

〖解答〗采用二重循环的程序如下。

public class Phalanx {

public static void main(String args[]) {

int n=4; //阶数 for (int i=0;i

for (int j=0;j

System.out.print(\ \ System.out.println(); } }

}

(2)输出下列形式的数字三角阵(当n=4时)。 1

1 2 1 1 2 3 2 1 1 2 3 4 3 2 1

〖解答〗采用二重循环的程序如下。

public class Tower {

public static void main(String args[]) {

int n=4;

//行数

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

for (int j=1;j<=n-i;j++) //前导空格 System.out.print(\ \ for (int j=1;j<=i;j++)

System.out.print(\ \ for (int j=i-1;j>0;j--)

System.out.print(\ \ System.out.println(); } } }

12.下列程序希望用for语句求出1~n累加和并显示,请问程序有错误吗?错在哪里?输出结果i和s的值分别是多少?

int i=1,n=10,s=0; for(i=1,i<=n,i++); s+=i;

System.out.pointln(“Sum=1+??+”+n+”=”+s); 有错误,正确的如下

int i=1,n=10,s=0; for(i=1,i<=n,i++) s+=i;

System.out.pointln(“Sum=1+??+”+n+”=”+s);

13.编程验证哥德巴赫猜想。哥德巴赫猜想:

(1)任何大于2的偶数都可以表示为2个素数之和,如16=3+13,16=5+11 (2)任何大于5的奇数都可以表示为3个素数之和,如11=2+2+7,11=3+3+5 〖解答〗程序如下。

public class Goldbach {

static final int MAX=30; //数据范围

static int[] prime=null; //存放素数的一维数组

static int number; //素数个数,即数组的实际元素个数

public Goldbach(int n)

//输出n的哥德巴赫算式

{

if (prime==null) init();

if (n%2==0) //偶数

{

int i=0;

while (i

if (isPrime(n-prime[i]))

System.out.print(n+\ \ i++; } }

else //奇数

{

int i=0;

while (i

int j=i; //如果j=0,则会出现重复的算式

while (j

if (isPrime(n-prime[i]-prime[j]))

System.out.print(n+\ +(n-prime[i]-prime[j])+\ j++; } i++; } }

System.out.println(); }

public static void init() //初始化数组,筛选法求素数 {

prime = new int[30];

prime[0]=2; //已知的最小素数 number=1; //素数个数

int i=1; //下一个素数应存放的数组下标位置 int k=3; //从最小奇数开始测试,所有偶数不需测试

do {

int j=0;

while ((j

if (j==number) //k是素数

{

prime[i]=k; //将k添加到数组prime中 i++;

number++; }

k+=2; //测试下一个奇数是否是素数 } while(k

public static void output() //输出素数 {

System.out.println(\ for (int i=0;i

System.out.print(\ \ if ((i+1)==0)

System.out.println(); //每行写10个数

}

System.out.println(\ }

public static boolean isPrime(int k) //判断k是否为素数,即在prime中查找k值 {

boolean yes=false; int i=0;

while (!yes && i<=number && prime[i]<=k) if (prime[i]==k) yes=true; else i++; return yes; }

public static void main(String args[]) {

for(int i=4;i

for(int i=7;i

程序运行结果如下:

All primes in 2~30 are: 2 3 5 7 11 13 17 19 23 29 number=10 偶数

4=2+2 6=3+3 8=3+5

10=3+7 10=5+5 12=5+7

14=3+11 14=7+7 16=3+13 16=5+11 18=5+13 18=7+11 20=3+17 20=7+13

22=3+19 22=5+17 22=11+11 24=5+19 24=7+17 24=11+13 26=3+23 26=7+19 26=13+13 28=5+23 28=11+17 奇数

7=2+2+3

9=2+2+5 9=3+3+3 11=2+2+7 11=3+3+5 13=3+3+7

15=2+2+11 15=3+5+7 15=5+5+5 17=2+2+13 17=3+3+11 17=5+5+7 19=3+3+13 19=3+5+11

21=2+2+17 21=3+5+13 21=3+7+11 21=5+5+11 21=7+7+7 23=2+2+19 23=3+3+17 23=3+7+13 23=5+5+13 23=5+7+11 25=3+3+19 25=3+5+17 25=5+7+13 25=7+7+11

27=2+2+23 27=3+5+19 27=3+7+17 27=5+5+17 27=7+7+13 29=3+3+23 29=3+7+19 29=5+5+19 29=5+7+17 不能有重复表达式,例如

19=3+3+13 19=3+5+11 19=5+3+11

21=2+2+17 21=3+5+13 21=3+7+11 21=5+3+13 21=5+5+11 21=7+3+11 21=7+7+7

14.Java的数组比C++的数组有哪些优越之处?

【答】Java语言不支持C++的指针类型,对数组的操作只能按照数组方式,不能使用指针。Java的数组都是动态数组,并且是引用数据类型,提高了安全性和简单性。另外,Java语言具有资源回收机制,能够自动收回不再使用的资源,一般情况下程序不需要归还数组所占

的内存空间。

15.作为引用数据类型,数组变量与基本数据类型的变量使用时有哪些区别?

【答】数组变量与基本数据类型变量不同点在于,存储单元的分配方式不同,两个变量之间的赋值方式也不同。基本数据类型变量获得存储单元的方式是静态的,声明了变量后系统就为变量分配了存储单元,就可以对变量赋值。两个变量之间的赋值是值本身。 数组变量的引用赋值,数组变量保存的是数组的引用,即数组占用的一片连续存储空间的首地址及长度特性。当声明一个数字变量而未申请空间时,变量是未初始化的,没有地址及特性值。只有申请了存储空间,才能以下标表示数组元素。

16.求一组数中的最大值和最小值。 【答】程序如下:

public class Zuizhi { public static void main(String[] args) { // TODO 自动生成方法存根

int array[]=new int[100];

for(int i=1;i<=30;++i)//初始化数组 array[i]=i;

int max=array[1];//保存最大值 int min=array[1];//保存最小值

for(int j=2;j<=30;++j) { max=Math.max(max, array[j]); min=Math.min(min, array[j]); }

System.out.println(\该数组最大值为:\System.out.println(\该数组最小值为:\

} }

运行结果如下: 该数组最大值为:30 该数组最小值为:1

17.采用一维数组输出杨辉三角形。

程序如下:

public class Yanghui1 {

public static void main(String args[]) {

int n=10; //n表示行数 int[] table = new int[n+1];

table[0]=1; //每行第1个数都为1 for (int i=1;i<=n;i++) //控制输出n行

{

for (int j=0;j

for (int j=i;j>0;j--) //生成下一行数据 table[j]=table[j-1]+table[j]; //通式 } } }

18.输出下列方阵:

(1) 输出如下形式的数字方阵(当n=4时):

1 2 6 7

3 5 8 13 4 9 12 14 10 11 15 16 程序如下:

Public class Jmat {

Public static void main(String args[]){ } }

(2)输出如下形式的数字方阵(当n=4时): 1 2 5 10

4 3 6 11 9 8 7 12 16 15 14 13

〖解答〗采用二维数组的程序如下。

public class Jmat {

public static void main(String args[]) {

int n=4; int[][] mat = new int[n][n];

int k=1; for (int i=0;i

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

mat[j][i] = k++;

for (int j=i-1;j>=0;j--) mat[i][j] = k++; }

阶数

是自然数,递增变化 //k先赋值后自加 // //k

for (int i=0;i

for (int j=0;j

System.out.print(\ \ System.out.println(); } } }

19.找出一个二维数组的鞍点,即该位置的元素在该行上最大,在列上最小。也可能没有暗点。

〖命题〗一个二维数组如果有鞍点,那么它只有一个鞍点。 〖证明〗反证法。

设该二维数组已有一个鞍点,为M[i,j],则有

M[i,*] <= M[i,j] <= M[*,j] 即i行上的所有元素均小于j列上的所有元素。 假设有另一个鞍点M[x,y],由(1)式知

(1)

M[i,y] <= M[x,j] (2) 而M[x,y]应在该行上最大,有

M[x,y] >= M[x,j] M[x,y]应在该列上最小,有

M[x,y] <= M[i,y] 根据(2)式,显然(3)和(4)式是不可能同时成立的。

因而假设有另一个鞍点M[x,y]是不成立的。由此证明。 〖解答〗采用二维数组的程序如下。

public class Dort {

public static void main(String args[]) {

int[][] mat = {{1,2,3},{4,5,6},{7,8,9}};

for (int i=0;i

for (int j=0;j

boolean find = false; //找到鞍点标记 int row=0; //第1行下标

int max=0; //记录当前行最大值的列下标 while (!find && row

max=0; //初始设每行第1列值最大 for (int j=1;j

//在row行上找最大值 //i、j是行、列下标 //输出二维数组元素

(3) (4)

if (mat[row][j]>mat[row][max]) //mat[row][max]为该行最大值 max = j;

boolean yes = true; //再判断mat[row][max]是否在列上最小 int j=0;

while (yes && j

if (j!=row && mat[j][max]

System.out.println(\ \ else

System.out.println(\ null\ }

20.设一个一维数组的元素值为:7,4,8,9,1和5,请输出具有以下内容的方阵: 7 4 8 9 1 5 5 7 4 8 9 1 1 5 7 4 8 9 9 1 5 7 4 8 8 9 1 5 7 4 4 8 9 1 5 7

【答】程序如下:

public class Shift {

public static void main(String args[]) {

int table[] = {7,4,8,9,1,5}; System.out.println(\左移:\ for (int i=0;i

for (int j=0;j

System.out.print(table[(i+j)%table.length]+\ \ System.out.println(); }

System.out.println(\左移:\ for (int i=0;i

int j=i;

do {

System.out.print(table[j]+\ \ j=(j+1)%table.length; }while (j!=i); System.out.println(); } } }

第3章 面向对象的核心特征

3-1 什么是类?什么是对象?他们之间的关系是怎样的?

【答】在面向对象的概念中,类是既包括数据又包括作用于数据的一组操作的封装体。类中的数据称为成员变量,类中的数据操作称为成员方法。类中的成员变量和成员方法统称为类的成员。

对象是类的实例。对象与类的关系就像变量与数据类型的关系一样。是抽象与具体,模板与实例的关系,类是抽象的、是模板,对象是具体的、是实例。

3-2 作为引用数据类型,对象在赋值和方法的参数传递方面与基本数据类型的变量有什么不同?

【答】作为引用数据类型,两个对象之间的赋值是引用赋值,对象可被赋值为null。具体可参见课本第三章图3.1的(d)。方法声明中形式参数的数据类型,既可以是基本数据类型,也可以是引用数据类型。如果形式参数的数据类型是基本数据类型,则实际参数向形式参数传递的是值;如果形参的数据类型是引用数据类型,则实参向形参传递的是引用。

同样,方法返回值的数据类型,既可以是基本数据类型,也可以是引用数据类型,两者分别传递值和引用。

3-3 面向对象技术的三个核心特性是什么? 【答】类的封装、继承和多态。

3-4 什么是封装?为什么要将类封装起来?封装的原则是什么?

【答】封装性是面向对象的核心特征之一,它提供一种信息隐藏技术。

类的封装包含两层含义:一是将数据和对数据的操作组合起来构成类,类是一个不可分割的独立单位;二是类中既要提供与外部联系的方法,同时又要尽可能隐藏类的实现细节。软件扩充和维护的需要需对类进行封装。封装原则:隐藏内部实现细节。

3-5 类中的方法与C++中的函数有什么差别?

【答】Java类中的成员方法与C语言中的函数很像,但在声明、调用等方面存在很大差别。具体方法可参考课本P66~P67。

3-6 类的构造方法和析构方法有什么作用?它们分别被谁调用?它们的访问权限范围应该是怎样的?是否每个类都必须设计构造方法和析构方法?没有设计构造方法和析构方法的类执行什么构造方法和析构方法?

【答】类的构造方法和析构方法是类特殊的成员方法,构造方法用于在创建实例时进行初始化;析构方法用于在释放实例时执行特定操作。构造方法由new运算符调用;析构方法可由对象调用,或被虚拟机自动执行。它们的访问权限范围通常都是public。

构造方法不能继承,析构方法能够继承。一个类可以不声明构造方法和析构方法。当一

Java为它提供一个无参数的默认构造方法,个类没有声明构造方法时,约定自动调用父类的

默认构造方法(无参数);当一个类没有声明析构方法时,它执行继承来的父类的析构方法。

3-7 Java定义了几个关键字用于表示几种访问权限?各表示什么含义?类有几种访问权限?

类中成员有几种访问权限?分别使用什么关键字?

【答】Java定义了三个表示权限的关键字(public、protected、private)。类有2种访问权限分别是:公有public,缺省。类中成员有4种访问权限分别是:公有public,可被所有类访问;保护protected,可被同一包及包外所有子类访问;缺省,可被当前包中所有类访问;私有private,只能被当前类访问。

3-8 this引用有什么作用?this引用有几种使用方法?

【答】Java类中成员方法与C语言中函数还有一个重要差别就是,Java类中每个成员方法都可以使用代词this引用调用该方法的当前对象自己,this引用有以下3种用法: (1)this用于指代调用成员方法的当前对象自身,语法格式如下: this

(2)通过this可以调用当前对象的成员变量,调用当前对象的成员方法。语法格式如下:

this.成员变量

this.成员方法([参数列表])注意:Java中的this是引用方式,不是C++中的指针方式。 (3)this引用还可以用在重载的构造方法中,调用本类已定义好的构造方法。语法格式如下:

this([参数列表])注意:在构造方法中,this()引用必须是第一行语句。

3-9 说明类成员与实例成员的区别。

【答】Java的类中可以包括两种成员:实例成员和类成员。

实例成员是属于对象的,实例成员包括实例成员变量和实例成员方法。类成员是属于类的,需要用关键字static标识,也称为静态成员。具体区别如下:

1.实例成员变量与类成员变量

(1) 两者声明时的差别。当一个类声明成员变量时,没有使用关键字static声明的为实例成员变量,使用关键字static声明的为类成员变量。

(2) 两者存储结构的差别。当创建一个对象时,系统会为每一个对象的每一个实例成员变量分配一个存储单元,使得属于不同对象的实例成员变量有不同的值;而为每一个类成员变量只分配一个存储单元,使得所有对象公用一个类成员变量。

(3) 两者引用方式的差别。实例成员变量属于对象,必须通过对象访问;类成员变量属于类,既可以通过对象,也可以通过类访问。

2.实例成员方法与类成员方法

(1) 两者声明时的差别。当一个类声明成员方法时,没有使用关键字static声明的为实例成员方法,使用关键字static声明的为类成员方法。

(2) 两者方法体中语句的差别。类成员方法只能访问类成员变量;实例成员方法既可以访问类成员变量,也可以访问实例成员变量。在实例成员方法体中,可以使用this引用指代当前对象;而在类成员方法体中,则不能使用this引用。

(3) 两者引用方式的差别。实例成员方法必须通过对象访问;类成员方法既可以通过对象,也可以通过类访问。

3-10 什么是继承?继承机制的作用是什么?子类继承了父类中的什么?子类不需要父类中的成员时怎么办?能够删除它们吗?Java允许一个类有多个父类吗?

【答】继承性是面向对象的核心特征之一,是一种由已有的类创建新类的机制。被继承的类称为父类或超类,通过继承产生的新类称为子类或派生类。继承机制是面向对象程序设计中实现软件可重用性的最重要手段。

通过继承,子类自动拥有父类的所有成员,包括成员变量和成员方法(不包括构造方法)。子类可以更改父类成员,还可以增加自己的成员,但是,不能删除父类的成员。

在Java中以“单重继承+接口”的方式代替多重继承,不允许一个类有多个父类。

3-11 子类能够访问父类中什么样权限的成员?

【答】虽然子类继承了父类的成员变量和成员方法,但并不是对所有的成员都有访问权限。访问权限说明如下:

(1)子类对父类的私有成员(private)没有访问权限。

(2)子类对父类的公有成员(public)和保护成员(protected)具有访问权限。

(3)子类对父类中缺省权限成员访问权限分为两种情况,对同一包中父类的缺省权限成员具有访问权限,而对不同包中父类的缺省权限成员没有访问权限。

3-12 如果子类声明的成员与父类成员同名会怎么样?

【答】如果子类重定义父类的同名成员变量,则子类隐藏了父类成员变量。如果子类重定义父类的同名成员方法,当子类方法的参数列表与父类方法的参数列表完全相同时,则称子类成员方法覆盖了成员方法。如果子类重定义父类的同名成员方法,当子类方法的参数列表与

父类方法的参数列表不同时,子类继承了父类的成员方法,并重载了继承来的该成员方法。

3-13 super引用有什么作用?super引用有几种使用方法?

【答】当子类重定义了父类成员时,则存在同名成员问题。此时,在子类方法体中,成员均默认为子类成员。如果需要引用父类同名成员,则需要使用supper引用。在以下两种同名成员情况下,需要使用supper引用。

(1)子类隐藏父类成员时,如需要访问父类同名成员变量时,需要使用supper指代父类的同名成员变量。语法如下:

super.成员变量

(2)子类覆盖父类成员时,如需要访问父类同名成员方法时,需要使用supper指代父类的同名成员方法。语法如下:

super.成员方法([参数列表])

注意:super引用不能像this引用一样单独使用。

3-14 什么是多态性?什么是方法的重载?方法的重载和覆盖有何区别?

【答】在面向对象语言中,多态是指一个方法可以有多种实现版本,类的多态性表现为方法的多态性。重载是指同一个类中的多个方法可以同名但参数列表必须不同。重载表现为同一个类中方法的多态性。覆盖是指子类重定义了父类中的同名方法。覆盖表现为父类与子类之间方法的多态性。

3-15 什么是运行时多态?方法的重载和覆盖分别是什么时的多态性?

【答】如果在编译时不能确定、只有在运行时才能确定执行多个同名方法中的哪一个,则称为运行时多态。方法的重载都是编译时多态。方法的覆盖变现出两种多态性,当对象获得本类的实例时,为编译时多态,否则为运行时多态。

3-16 什么是抽象类?在什么情况下需要设计抽象类?抽象类中是否必须有抽象方法?

【答】使用关键字abstract声明的类称为抽象类,使用abstract声明的成员方法为抽象方法。抽象类中可以不包含抽象方法,但包含抽象方法的类必须被声明为抽象类。

3-17 什么是最终类?在什么情况下需要设计最终类?最终类中是否必须有最终方法? 【答】使用关键字final声明的类称为最终类,最终类不能被继承。使用final声明的成员方法称为最终方法,最终方法不能被子类覆盖。最终类中包含的都是最终方法,非最终类也可以包含最终方法。

3-18 将辗转相除法求两个整数的最大公因数gcd(a,b)用递归方法实现,辗转相除法题意见例2.11,再设计下列方法:

(1)求两个整数a﹑ b的最小公倍数; (2)求三个整数a﹑b﹑c的最大公约数。 〖解答〗程序如下。

public class GCD_recursion {

public static int gcd(int a,int b) //返回a,b的最大公因数 {

if (b==0) return a; if (a<0)

return gcd(-a,b); if (b<0)

return gcd(a,-b);

return gcd(b, a%b); }

public static int gcd(int a,int b,int c) {

return gcd(gcd(a,b),c); }

public static int multiple(int a,int b) {

return a*b/gcd(a,b); }

public static void main(String args[]) {

int a=12,b=18,c=27;

System.out.println(\ System.out.println(\ System.out.println(\ System.out.println(\ } }

//返回a,b的最小公倍数 //返回a,b,c的最大公因数

程序运行结果如下:

gcd(12,18)=6 gcd(-12,18)=6 gcd(12,18,27)=3 multiple(12,18)=36

3-19 用递归方法求 n个数的无重复全排列。

〖解答〗程序如下。

public class Permutation {

private int[] table;

public Permutation(int n) //构造方法 {

if (n>0) {

table = new int[n]; for (int i=0;i

table = null; }

private void output() //输出数组元素 {

for (int i=0;i

private void swap(int i,int j) {

if (table!=null && i>=0 && i=0 && j

int temp = table[i]; table[i] = table[j]; table[j] = temp; } }

private void permute(int n) //用递归方法求n个数的无重复全排列 {

if (n==1) this.output(); else {

permute(n-1); for (int j=0;j

swap(n-1,j); permute(n-1); swap(n-1,j); }

//交换数组两个元素值

} }

public static void main(String args[]) {

new Permutation(3); } }

程序运行结果如下:

1 2 3 2 1 3 3 2 1 2 3 1 1 3 2 3 1 2

3-20 Java为什么不支持指针?C++的指针类型存在哪些潜在的错误?没有指针,Java如何实现在C++中用指针实现的功能?例如,通过访问指针访问数组元素,通过指针使用字符串,方法参数传递地址,方法参数用于输出,方法返回非基本数据类型等。

【答】由于指针往往在带来方便的同时也导致代码不安全的根源,如内存泄露等,同时也会

使程序变得非常复杂难以理解,Java语言明确说明取消了指针。Java使用引用代替了指针。

3-21 Java为什么不支持C++的运算符重载特性?

【答】这是为了防止运算符重载使得代码的功能变的不清晰。

第4章 接口﹑内部类和包

4-1 什么是接口?接口和抽象类有哪些相同之处和不同之处?

【答】接口是一组常量和抽象方法的集合。在Java中,接口是一种引用数据类型,用关键字implements声明。接口与抽象类的区别为:

相同点:1.两者都包含抽象方法,约定多个类共用方法的参数列表和返回值。2.两者都不能被实例化。3.两者都是引用数据类型,其变量可被赋值为子类或实现接口类的对象。

不同点:1.抽象类约定多个子类之间共同使用的方法;接口约定多个互不相关类之间共同使用的方法。2.抽象类与子类之间采用单重继承机制;一个类实现多个接口则实现了多重

3.抽象类及其类中成员具有与普通类一样的访问权限;继承的功能。接口的访问权限由public

和缺省两种,接口中成员的访问权限均是public。4.抽象类中可以包含非抽象方法,也可以声明构造方法;接口中的方法必须全部是抽象方法,不能声明构造方法。5.抽象类中可以声明成员变量,子类可以对该成员变量赋值;接口中只能声明常量。

4-2 为什么能够声明接口变量?接口变量能够获得什么样的值?

【答】接口是引用数据类型可以声明接口变量。接口变量能够获得实现接口的类的对象,也称为接口对象。

4-3 接口有哪些特点?为什么需要声明借口?接口是否具有继承性?接口中能否写构造方法?

【答】接口特点:

(1)接口及接口中成员的访问权限都是public

(2)接口中的成员方法都是公有的、抽象的实例成员方法,即默认修饰符为public abstract。

(3)接口中的所有抽象方法必须全部被实现接口的类覆盖。 (4)接口中的成员变量都是常量

(5)接口不能被实例化。接口中的方法都是抽象的,构造方法不是抽象的所有不能写构造方法

(6)接口是引用数据类型。

Java只支持单重继承,以“单重继承+接口”的方式代替多继承。接口可以继承一个已经存在的父接口。

4-4 什么是单重继承?什么是多重继承?类的层次体系为什么需要多重继承?单重继承有什么缺点?既然有缺点,为什么Java仍然采用单重继承?Java怎样实现多重继承? 【答】单重继承就是一个类只能有一个父类。多继承就是可以有多个父类。现实中的对象往往表现出多种特性,用单重继承无法客观描绘,因此需要多重继承。但是C++的多重继承过于复杂,因此Java用“单重继承+接口”代替了多重继承,以提高运行效率,增加安全性,降低复杂性。

4-5 类与类之间存在哪几种关系?

【答】类与类之间有继承关系,还存在嵌套关系。

4-6 在什么情况下需要声明内部类?内部类有哪些特性?

Java不支持C++的结构(struct)类型,【答】当实际中需要使用一个结构时,可以声明一个类;但当结构作为数组的元素类型时,或当一个类中需要使用结构时,可以将结构声明为内部类。内部类特性可参看课本P123。

4-7 为什么是包?为什么需要包机制?Java有哪些包?各有什么功能?

【答】从逻辑概念看,包是类的集合,一个包中包含多个类;从存储概念看,包是类的组织方式,一个包对应一个文件夹,一个文件夹中包含多个字节码文件;包与类的关系,就像文件夹与文件的关系一样。为解决字节码文件存放和类命名的问题,Java提供了包机制。Java的常用包及其作用可查看P130表4-1 。

4-8 Java的API采用什么组织方式?怎样使用Java定义好的类?

【答】Java语言的API按照功能划分成若干包,每个包都有许多公有的类和接口。如果需要使用已定义好的一个包中的类或接口,可以使用import语句声明。

4-9 Java声明Object类的作用是什么?Object类中声明了哪些方法?Object类在Java类层次体系中的地位是怎样的?

【答】Object是Java中所有类的父类或祖先类,它定义了一个Java对象所需要的基本操作和属性。定义的方法有:1.getClass()获得当前对象所在的类是什么、equals()比较两个对象是否相等、toString()将当前对象的信息用字符串描述、finalize()析构方法。

4-10 Java为什么需要声明基本数据类型的包装类?基本数据类型的包装类有哪些?

【答】为实现完全面向对象的特性,Java为每个基本数据类型都声明有对应的一个类。公有8个基本数据类型的包装类:Byte、Short、Integer、Long、Float、Double、Character、Boolean

4-11 怎样将数值类型的数据转换成字符串?怎样将字符串转换成数值类型的数据?

【答】Integer类的静态方法parseInt()和实例方法intValue()都可以将一个字符串转换成int值。Integer类的静态方法toBinaryString(int i)、toOctalString(int i)、Integer.toHexString(int i)可以将十进制i转化为二进制、八进制、十六进制、字符串。

4-12 Java为什么要将Math类声明为最终类?Math类中有哪些常用方法?

【答】Math类提供提供E、PI常量和一组固定数学函数。都是静态可以直接通过类名引用,不需要继承。常用方法有:(1)求绝对值abs(double a)(2)求最大值max(double a,double b)(3)求最小值min(double a,double b)(3)返回一个0.0~1.0之间的随机数random()

4-13 对数值﹑变量或对象进行比较操作,到底应该采用6个关系运算符还是调用equals()、compareTo()方法?是否每个对象都可以调用equals()和compareTo()方法?为什么?这两个方法在进行比较操作时有什么差别?它们在每个类中的含义都相同吗?

【答】对数值、变量可以采用6个关系运算符,对象可以用后两者,但是并不是每个对象都可以调用这两个方法。具体用法及区别请看课本P133和P136.

4-14 System类、Class类和Runtime类各有哪些功能?在之前的程序中已用到这些类的哪些常量或方法?

【答】System类提供访问系统资源和标准输入/输出流的方法,之前用到了in和out常量。

Class为类提供运行时信息,如名字、类型、以及父类等。Runtime类可直接访问运行时资源。

4-15 怎样表示日期与时间数据?怎样引用java.util包的类?

Java以一个长整型表示一个日期,【答】该长整型表示从格林尼治时间1970-1-1 00:00:00 开始至某时刻的累积毫秒数。

4-16 泛型类有什么作用?在什么情况下需要使用泛型类?

【答】泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口、和方法的创建中,分别被称为泛型类、泛型接口、泛型方法。泛型类引入的好处不仅在于减少代码量,还在于提供了编译时期数据类型的检查功能,可以提前预知错误的发生,减少代码安全性,二是减少了强制转换类型。

第5章 异常处理

5-1 程序中的错误有哪几种?分别能够在什么时刻被发现?

【答】 程序错误按照性质可分为3类:语法错、语义错、逻辑错。

1 语法错:违反语法规范的错误成为语法错( syntax error ),这类错误通常在编译时发现,又称为编译错,如标识符未声明、表达式中运算符与操作数类型不兼容、变量赋值时的类型与声明时的类型不匹配、括号不匹配、语句末缺少分号等。

2 语义错:如果在程序的语法上正确,但在语义上存在错误,则称为语义错( semantic error),又称为运行错(run-time error),语义错不能被编译系统发现,只有到程序运行时才能被发现,如输入数据格式错、除数为0错、给变量赋予超出其范围的值错等。

3 逻辑错:如果程序通过编译,可运行,但运行结果与期望值不符,则这类错误称为逻辑错(logic error),例如,由于循环条件不正确而没有结果,循环次数不对等因素导致计算结果不正确等。

5-2 Java为什么要采用异常处理机制?Java的异常处理是怎样实现的?异常处理机制能够

解决程序中遇到的所有错误吗?哪些错误不是异常处理能够解决的?

【答】 异常处理和捕获和处理运行时错误的一种机制。异常处理机制使程序具有处理错误的能力。即使发生了运行错,应用程序能够捕获异常并及时处理异常,使程序从运行错误中很好地恢复并继续运行,而不会导致程序运行非正常终止。而且如果当前方法没有能力处理异常,还可以将异常转交给调用者处理。异常处理机制将运行时错误封装成若干错误类和异常类,并提供异常处理语句用于处理在程序中实现对运行时错误的发现和及时处理。异常处理机制并不能解决程序中的所有错误,例如内存溢出、栈溢出等。

5-3 请说出5个Java的异常类。

【答】 算术异常ArithmeticException、空对象异常NullPointerException、类型强制转换异常ClassCastException、负数组长度异常NegativeArraySizeException、数组下标越界异常 ArrayIndexOutOfBundsException等

5-4 请问运行没有main()方法的类会怎样?

【答】 此类错误是Error类,当运行没有main()方法的类时,则产生类定义未找到的错误(NoClassDefFoundError)。

5-5 举例说明你在调试程序时,遇到过哪些错误和异常,采取什么办法解决问题的。 【答】1.无效的游标状态

修改:首先查看ResultSet是否为空,若为空则修改之;其次,也是我遇到的,就是:举个例子说明,如下

rs.getString(1);

rs.getString(3);//注意3和2的顺序颠倒了 rs.getString(2);//此时会出现异常

ResultSet只能按顺序访问列的值,说明:不能颠倒,我猜想这可能是JDBC的一个BUG

吧。不过后来我看.NET中的DataReader类后才恍然大悟,原来,ResultSet的游标每向后移动,前面的数据就会被丢弃掉,这样做有利于提高访问速度。

2. ResultSet is closed

原因:一个Statement只能维持一个ResultSet为打开状态,后面的覆盖前面的,举个例子:

ResultSet rs1 = stmt.excuteQuery(); ResultSet rs2 = stmt.excuteQuery();

String s = rs1.getString(1);//出现异常,因为rs1已经被关闭 3. 连接占线导致另一个 hstmt

原因:一个Connection只能维持一个Statement为打开状态 一个例子:

Statement stmt1 = con.createStatement(); Statement stmt2 = con.createStatement(); stmts.excuteQuery(sql);//出现异常 其他异常 空指针异常

空指针异常应该说是最常见的异常了 原因主要有以下几点:

1.未初始化的变量(虽然已经声明)

2.使用了未初始化的对象(虽然已经声明)

注:引起这个异常的根本原因有可能隐藏的很深,空指针异常只不过是个表象而已(又被不幸的我遇到了).

5-6 如何处理除数为0异常?

【答】 进行除数运算时,先判断除数是否为0,若为0,则跳出提示。

5-7 怎样处理数组下标异常?

【答】 使用数组前先,判断下标是否小于数值长度,若不小于则提示数组下标有误。

5-8 说明采用什么语句能够捕获并处理异常?

Java提供try-catch-finally语句来捕获和处理一个或多个异常。try、catch、finally【答】其中,

catch字句可以有一个或多个,finally字句可以省略。 是关键字。但至少要有一个catch字句,

5-9 为什么将字符串转换成数值类型时会抛出异常?抛出什么异常?

【答】 并不是所有的字符串都能转换成数值型,当遇到一个不能转转换成数值型的字符串时,Java抛出NumberFormatException异常。

5-10 说明throw语句与throws子句的区别。

【答】1.throws 用于抛出方法层次的异常, 并且直接由些方法调用异常处理类来处理该异常,所以它常用在方法的后面。比如 public static void main(String[] args) throws SQLException

2.throw 用于抛出代码层次的异常,常用于方法块里面的代码,常和try...catch ....语句块搭配实用,比throws的层次要低。

5-11 什么情况下需要自定义异常类?

当Java提供的异常类不能满足需要时,【答】程序需要对自己抛出的异常类进行特殊处理,则可以自定义异常类。

第6章 图形用户界面

6-1 什么是组件?组件类与普通类有什么不同?

【答】组件是构成图形用户界面的基本成分和核心元素;组件是具有以下特性的对象:运行时可见,能拥有并管理其他组件,在窗口中可操纵,可获得输入焦点等。组件类Component是一个抽象类,是AWT组件类层次结构的根类,它提供对组件操作的通用方法。 6-2 设计Windows应用程序的图形用户界面需要哪些基本知识?

【答】需要掌握Java组件的使用方法,理解委托事件处理模型,掌握多种布局方式。 6-3 什么是容器组件?它有什么特点?Java提供了哪些容器组件?

【答】容器组件是一种能够容纳其他组件的特殊组件。特点:能容纳其他组件,并在其可视区域内显示这些组件。Java提供了窗口(window)和面板(panel)两种容器。 6-4 窗口与对话框有什么不同?框架与面板有什么不同?

【答】对话框是窗口类的子类,对话框也是一种可移动的窗口,不能作为应用程序的主窗口,它依赖于一个框架窗口而存在,当框架窗口关闭时,对话框也关闭。框架类是一种带标题栏并且可以改变大小的窗口;它是窗口类的子类,所以它可以独立存在,可被移动,可被最大化和最小化,有标题栏、边框、可添加菜单栏;而面板不能独立存在,必须包含在另一个容器里,面板没有标题,没有边框,不可添加菜单栏。 6-5 什么是事件?什么是事件源?事件处理程序写在哪里?

【答】事件是指一个状态的改变,或者一个活动的发生。产生事件的组件称为事件源。事件处理程序写在事件监听器接口中声明的方法中。如:单击事件的事件处理程序由ActionListener接口中的actionPerformed()方法实现。

6-6 如何理解Windows应用程序的图形用户界面是事件驱动的?

【答】一个组件的多个事件之间,多个组件的多个事件之间,其事件处理方法的执行次序是有规律的:1.不同组件的事件或同一组件的不同事件具有约定的执行次序。2.各组件的事件处理方法是否执行以及执行次序,取决于用户操作。3.在一个事件处理方法中,程序按照语句的书写次序顺序执行。 6-7 说明Java的委托事件模型。

【答】事件源产生一个事件,并把这个事件发送到一个或多个监听程序,监听程序只是等待这个事件并处理它,然后返回。即程序把事件的处理“委托”给一段“代码”。

6-8 设计图形用户界面的Java应用程序,需要用到的组件分别在哪些包中?事件分别在哪些包中?

【答】 组件在java.awt包中,事件在java.awt.Event和javax.swing.Event包中。 6-9 按钮组件能够注册哪些事件监听器?文本行组件能够注册哪些事件监听器?文本行和文本区组件能够响应的事件有什么不同?

【答】按钮组件能够注册的事件监听器有ActionListener、ComponentListener、ItemListener等。文本行组件能够注册的事件监听器有ActionListener、ComponentListener、TextListener等。文本行是单行文本编辑框,用于编辑一行字符串,文本区是一个多行文本编辑框,它的基本操作与文本行类似,增加的是滚动条的显示和操作。 6-10 是否可以对一个组件注册多个事件监听器?

【答】可以。如果一个组件需要响应多个事件,则可以注册多个事件监听器。 6-11 一个事件监听器是否可以处理多个组件上产生的操作?

【答】一个事件监听器对应一个事件处理方法,如果多个组件产生的操作相同,则可以

注册同一个事件监听器。

6-12 在事件处理方法中,怎样区分不同的事件源组件?

【答】事件接口中的所有事件处理方法,都采用相应的事件对象e作为参数, 用e.getSource()方法可返回产生当前事件对象的事件源组件。

6-13 窗口上有哪些事件?每种事件在什么时候被触发?这些事件的触发次序是怎样的?

【答】窗口上的事件有:

windowOPend,windowActivated,windowDeactivated,windowIconified,windowDeiconified,windowClosing,windowClosed。每种事件的触发分别在:打开窗口、激活窗口、窗口失去焦点、窗口最小化、窗口恢复、关闭窗口时、关闭窗口后。触发次序与前述书写顺序相同。

6-14 Java有几种关闭窗口处理方式?分别是怎样的?分别适用于哪些窗口组件?

【答】Java有2种关闭窗口处理方式。第一种是设置窗口关闭时隐藏方式的setDefaultCloseOperation()方法,第二种是写窗口关闭事件处理程序即实现WindowListener接口中的windowClosing()方法。第一种适用于JFrame和JDialog等窗口组件,第二种适用于Frame和Dialog等窗口组件。

6-15 Java的布局方式有什么特点?Java提供了哪些布局方式?

【答】特点:Java采用布局管理器对图形用户界面中的组件进行相对定位并自动改变组件大小,合理分布组件格局。当窗口大小改变时,各组件自身的大小将随之改变,而组件之间的相对位置不变,这样组件一般不会被覆盖。Java提供了FlowLayout、BorderLayout、GridLayout三种布局布局管理器类。

6-16 复选框和单选按钮有什么不同?分别用于什么场合?在事件处理程序中,怎样知道哪个复选框或单选按钮是选中的?

【答】在同一组单选按钮中,任何时候最多只能有一个被选择,一旦选中一个单选按钮,则前一个选中的单选按钮会自动变为未选中状态。而复选框可多个同时被选中,且每个复选框选中与否的状态改变,并不影响其他复选框的状态。场合:单选按钮用来显示一组互斥的选择,复选框用来显示一组不互斥的选择。在事件处理程序中,用注册选择事件监听器的方法来判断复选框或单选按钮是否被选中。

6-17 如果一个编辑框用于输入数值,但程序运行时却输入了非数字字符,问结果会怎样?程序中有哪些办法解决这个问题,怎样解决?

【答】结果会因输入错误而突然停止运行。程序中可以用try—catch捕获、处理异常的方法来解决这个问题。当遇到输入错误时,Java将抛出异常,此时弹出一个提示信息对话框,提醒用户输入数据有错误,请用户重新输入。 6-18 如何将JComboBox编辑框中新输入的值,加入到下拉列表中去,并使新值与下拉列表中原有值不重复?

【答】通过添加单击事件监听器将JcomboBox编辑框中新输入的值加入到下拉列表中。通过if语句来确保新值与下拉列表中原有值不重复。

6-19 如何使菜单项显现为分隔条状态?如何使菜单项显现单选状态?

【答】实现JmenuItem()和addSeparator()方法使菜单项显现为分离条状态。实现JradioButtonMenuItem()方法使菜单项显现单选状态。

6-20 一个菜单中能否加入菜单项?能否加入另一个菜单? 【答】一个菜单中可以加入菜单项,可以加入另一个菜单。

6.21 窗口菜单与快捷菜单有什么差别?

【答】窗口菜单是相对于窗口的,它出现在窗口的标题栏下,总是与窗口同时出现。而快捷菜单则是相对于某个指定组建的,当鼠标指向某个组件并单击右键时,则会弹出快捷菜

单,一般比较简单。

6.22 在文本区中,单击右键时欲弹出一个菜单,该怎样设计? 【答】可以在文本区添加一个快捷菜单(popMenu)。

6.23 如果窗口菜单中的某菜单项、快捷菜单中的某菜单项具有相同的菜单标题并执行相同的操作,应该如何设计?

【答】 可以给它们都注册单击事件监听器,那么在事件处理方法actionPerformed()中以e.getActionCommand()方法获得菜单项的标题,由于标题相同,可以执行相同的操作。

6.24 如果希望在组件上绘图,通常在哪些组件上绘图?绘图程序写在哪里?

【答】一般来讲,可以在任何组件上绘图,但由于很多组件上都有标题之类的文字,所以通常在窗口或面板之类的容器上绘制图形。此外,Java提供画布(java.awt.Canvas)组件作为绘制图形的区域。在Java.awt.Component类中声明paint()和repaint()方法用于显示和刷新图形。当创建一个对象时,系统会自动执行该组件的paint()方法,绘制特定图形。因此,如果想在组建上绘图,则该类必须声明为继承某个组件类,让偶将绘图程序写在paint()方法体中就可以了。

6.25 根据以下极坐标放出,画出相应曲线图形。 1.星形线 代码略 运行结果如下

2.心形线

import java.awt.*; import java.awt.event.*; import javax.swing.*;

public class HeartJFrame extends JFrame implements ComponentListener,ItemListener {

private JComboBox combobox_color; public HeartJFrame() {

super(\心线\

this.setSize(600,400);

this.setDefaultCloseOperation(EXIT_ON_CLOSE); this.setLayout(new FlowLayout());

Object data[] = {Color.red,Color.green,Color.CYAN,Color.blue}; combobox_color = new JComboBox(data); combobox_color.addItemListener(this); this.add(combobox_color);

this.addComponentListener(this); this.setVisible(true); }

public void paint(Graphics g) {

int x0,y0;

x0=this.getWidth()/2; y0=this.getHeight()/2;

g.setColor((Color)combobox_color.getSelectedItem());//设置线的颜色为组合框选中的颜色

g.drawLine(x0, 0, x0, y0*2); g.drawLine(0, y0, x0*2, y0); int j=20; while(j <100) {

for(int i=0;i <1023;i ) {

double angle=i*Math.PI/512;//

double radius=j*(1-Math.cos(angle));//求出半径; int x=(int)Math.round(radius*Math.cos(angle)*2); int y=(int)Math.round(radius*Math.sin(angle)); g.fillOval(x0 x,y0 y,1,1); }

j=j 10; } }

public void itemStateChanged(ItemEvent e) {

repaint(); }

public void componentResized(ComponentEvent e) {

repaint(); }

public void componentHidden(ComponentEvent arg0) { // TODO Auto-generated method stub }

public void componentMoved(ComponentEvent arg0) { // TODO Auto-generated method stub

}

public void componentShown(ComponentEvent arg0) { // TODO Auto-generated method stub }

public static void main(String args[]) {

new HeartJFrame(); } }

3.阿基米德螺线

import java.awt.*;

import java.awt.event.*; import javax.swing.*;

public class HelixJFrame extends JFrame implements ComponentListener,

ActionListener

{

private JRadioButton colors[]; //表示颜色的单

选按钮数组

private HelixCanvas helix; public HelixJFrame() {

super(\阿基米德螺旋线\//边布局 this.setSize(600,700);

this.setDefaultCloseOperation(EXIT_ON_CLOSE);

this.addComponentListener(this); //注册框架窗口

的组件事件监听器

JPanel jpanel = new JPanel(); //流布局,居中 this.getContentPane().add(jpanel,\

ButtonGroup buttongroup = new ButtonGroup(); //按钮组 colors = new JRadioButton[3];

colors[0] = new JRadioButton(\//创建单选

按钮

colors[0].setForeground(Color.red);

buttongroup.add(colors[0]); //单选按钮添加

到按钮组

jpanel.add(colors[0]); //单选按钮添加

到子面板

colors[0].addActionListener(this);

colors[1] = new JRadioButton(\ colors[1].setForeground(Color.green); buttongroup.add(colors[1]); jpanel.add(colors[1]);

colors[1].addActionListener(this);

colors[2] = new JRadioButton(\ colors[2].setForeground(Color.blue); buttongroup.add(colors[2]); jpanel.add(colors[2]);

colors[2].addActionListener(this);

helix = new HelixCanvas(Color.red);

this.getContentPane().add(helix,\ this.setVisible(true); }

public void actionPerformed(ActionEvent e) //钮时

{

if (e.getSource() == //(colors[0].isSelected())

helix.setColor(Color.red); if (e.getSource() == colors[1]) helix.setColor(Color.green); if (e.getSource() == colors[2]) helix.setColor(Color.blue);

helix.repaint(); // }

public void componentResized(ComponentEvent e) //小时

{

helix.repaint(); // }

public void componentMoved(ComponentEvent e) { } public void componentHidden(ComponentEvent e) { } public void componentShown(ComponentEvent e) { } public static void main(String arg[]) {

new HelixJFrame(); } }

class HelixCanvas extends Canvas //{

private Color color; // public HelixCanvas(Color color) {

this.setColor(color); }

public void setColor(Color color) {

this.color = color; }

选中单选按

colors[0])

重画 改变窗口大

重画 画布组件 颜色

public void paint(Graphics g) //在Canvas

上作图

{

int x0,y0; //原点坐标 x0 = this.getWidth() /2; //宽度 y0 = this.getHeight()/2;

g.setColor(color); //设置画线

颜色

g.drawLine(x0,0,x0,y0*2); g.drawLine(0,y0,x0*2,y0); int i,x,y;

double pi=3.14,angle,r,a=0.5; while (a<10) {

for (i=0;i<4000;i++) {

angle = i*pi/512; r = a*angle;

x =(int) Math.round(r*angle*Math.cos(angle)); y =(int) Math.round(r*angle*Math.sin(angle)); g.fillOval(x0+x,y0+y,1,1); }

a+=10; } } } 4.对数螺线

5.双曲螺线

import java.awt.*;

import java.awt.event.*; import javax.swing.*;

public class TestDui extends JFrame implements ComponentListener,ItemListener {

private JComboBox combobox_color; public TestDui () {

super(\双曲螺线\this.setSize(600,400);

this.setDefaultCloseOperation(EXIT_ON_CLOSE); this.setLayout(new FlowLayout());

Object data[] = {Color.red,Color.green,Color.CYAN,Color.blue}; combobox_color = new JComboBox(data); combobox_color.addItemListener(this); this.add(combobox_color);

this.addComponentListener(this); this.setVisible(true); }

public void paint(Graphics g) {

int x0,y0;

x0=this.getWidth()/2; y0=this.getHeight()/2;

g.setColor((Color)combobox_color.getSelectedItem());//设置线的颜色为组合框选中的颜色

g.drawLine(x0, 0, x0, y0*2); g.drawLine(0, y0, x0*2, y0); int j=20;

double a,b,c=300; while(j <100) {

for(a=36000.0;a>0;a-=0.1) {

b=c/a;

int x=(int)(b*Math.cos(a)+300); int y=(int)(b*Math.sin(a)+300); g.drawLine(x0,y0,x,y); x0=x;y0=y; }

j=j+10; } }

public void itemStateChanged(ItemEvent e) {

repaint(); }

public void componentResized(ComponentEvent e) {

repaint(); }

public void componentHidden(ComponentEvent arg0) { // TODO Auto-generated method stub

}

public void componentMoved(ComponentEvent arg0) { // TODO Auto-generated method stub }

public void componentShown(ComponentEvent arg0) { // TODO Auto-generated method stub }

public static void main(String args[]) {

new TestDui(); } }

6.伯努利双纽线

7.三夜玫瑰线

import java.awt.*;

import java.awt.event.*; import javax.swing.*;

public class RoseJFrame_JColorChooser extends JFrame implements

ComponentListener, ActionListener

{

private RoseCanvas rose;

private JButton button_color; public RoseJFrame_JColorChooser() {

super(\三叶玫瑰线\//边布局 this.setSize(600,400);

this.setDefaultCloseOperation(EXIT_ON_CLOSE);

this.addComponentListener(this); //注册框架

窗口的组件事件监听器

JPanel jpanel = new JPanel(); //流布局,居中 this.getContentPane().add(jpanel,\ button_color = new JButton(\选择颜色\ jpanel.add(button_color);

button_color.addActionListener(this); rose = new RoseCanvas(Color.red);

this.getContentPane().add(rose,\ this.setVisible(true); }

public void actionPerformed(ActionEvent e) //选中单选按钮时 {

if (e.getSource() == button_color) {

Color color = JColorChooser.showDialog(this,\选择颜色

\

rose.setColor(color);

rose.repaint(); //重画 } }

public void componentResized(ComponentEvent e) // {

rose.repaint(); // }

public void componentMoved(ComponentEvent e) { } public void componentHidden(ComponentEvent e) { } public void componentShown(ComponentEvent e) { } public static void main(String arg[]) {

new RoseJFrame_JColorChooser(); } }

class RoseCanvas extends Canvas //{

private Color color; //

public RoseCanvas(Color color) {

this.setColor(color); }

public void setColor(Color color) {

this.color = color; }

public void paint(Graphics g) // {

int x0,y0; x0 = this.getWidth() /2; // y0 = this.getHeight()/2;

g.setColor(color); // g.drawLine(x0,0,x0,y0*3); g.drawLine(0,y0,x0*2,y0); int j=40;

while (j<200) {

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

double angle = i*Math.PI/512;

改变窗口大小时重画 画布组件 颜色 在Canvas上作图//原点坐标 宽度 设置画线颜色

double radius = j*Math.sin(2*angle);

int x =(int) Math.round(radius * Math.cos(angle) ); int y =(int) Math.round(radius * Math.sin(angle));

g.fillOval(x0+x,y0+y,1,1); //画直径为1的圆就是一个点 }

j += 20; } } }

8.四叶玫瑰线 见课本。

第7章 多线程

7.1 什么是进程?什么是线程?进程与线程的关系是怎样的?

【答】进程:进程是一个可并发的具有独立功能的程序关于某个数据集合的一次执行过程,也是操作系统进行资源分配和保护的基本单位。

线程:线程是操作系统进程中能够独立执行的实体,是处理器调度和分派的基本单位。 线程是进程的组成部分,每个进程内允许包含多个并发执行的线程。 7.2 操作系统为什么要支持多线程技术? 【答】操作系统采用进程机制能够减少程序并发时所付出的时空开销,使得并发粒度更细,并发性更好,提高了资源使用率和系统效率。

7.3 Java为什么要支持线程?什么场合需要使用多线程程序设计?

【答】支持多线程能充分发挥硬件的并发性,消除处理器和I/O设备的互等现象,提高系统效率。 一般一下场合需要使用多线程:1、程序包好复杂的计算任务时,主要是利用多线程获取更所得CPU时间。2、处理速度较慢的外围设备。3、程序设计自身的需要。 7.4 Java提供了哪些接口和类实现多线程机制? 【答】Java主要提供了java.lang.Runnable接口和Thread线程类来实现多线程机制。 7.5 一个线程对象的生命周期有哪几种状态构成?各状态之间是如何变化的? 【答】

线程对象的生命周期主要包括:新建态、就绪态和运行态、阻塞态和等待态、终止态。新建态通过start()方法是线程成为运行态,当运行态遇到sleep()或wait()方法时就进入等待态,而当sleep()时间到或通过notify()方法线程就又进入了运行态;当运行态遇到synchronized()方法时就进入阻塞态,当线程获得互斥锁使用权时就又到了运行态;当线程的run()方法结束时整个线程就进入了终止态,整个线程结束。

7.6 Java提供了哪些方法能够改变线程状态?程序中能够调度线程立即执行吗? 【答】Java中提供了start()方法来启动已创建的线程对象;sleep()方法使当前线程睡眠若干毫秒,线程有运行态进入等待态,但是不交出临界区的锁;yield() 方法暂停当前线程的执行,允许其他线程竞争CPU;stop()方法来结束一个线程;wait()方法将本线程设为等待态;notify() 方法来唤醒当前处于等待态的线程;interrupt()方法改变当前线程的中断状态,但是当前线程还可以继续执行。

7.7 什么是线程的优先级?设置线程优先级有什么作用?

【答】每个线程被执行的优先顺序即为线程的优先级,默认优先级为5。当创建了多个线程并要执行这些线程时,操作系统不知到底该执行哪个线程,当设置好优先级后,程序首

先会执行优先级最高的线程,然后依次执行下去。这样处理器将会合理而且充实的额被利用,不会造成资源的浪费或者运行的混乱。 7.8 线程按什么规则排队等待?

【答】线程按优先级排队,线程调度语句优先级基础上的“先到先服务”原则 7.9 多线程间共享数据时会发生怎样的并发执行错误?

【答】当几个线程共享数据时,一个线程的执行可能影响其他线程的执行结果,并导致错误的程序运行结果。

7.10 在什么情况下需要采用线程同步机制? 【答】当并发执行的多个线程间需要共享资源或交换数据时,各个线程执行时相互之间会干扰或影响其他线程的执行结果,这时就需要采用线程同步机制。

7.11 关键字synchronized是什么含义?为什么wait()和notify()方法要与synchronized同时使用?

【答】synchronized用于声明一段程序为临界区,使线程对临界资源采用互斥使用方式。

wait()和notify()不是属于线程类,而是每一个对象都具有的方法,而且这两个方法都和对象锁有关,有锁的地方必有synchronized()方法,故wait()和notify()方法要与synchronized同时使用。

7.12 明sleep()和wait()方法的异同。

【答】wait是Object类的方法,sleep与yield都是Thread类的方法。wait调用的时候需要注意的是该方法是释放锁标志的,而sleep在调用的时候是紧紧抱着锁标志的,也就是等他完全执行完成了才可以让其他线程来访问的

sleep 方法使当前运行中的线程睡眼一段时间,进入不可运行状态,这段时间的长短是由程序设定的,yield 方法使当前线程让出 CPU 占有权,但让出的时间是不可设定的。 7.13 一个对象为什么需要调用wait()方法使当前线程等待?

【答】wait()使当前线程进入停滞状态时,还会释放当前线程所占有的“锁标志”, 从而使线程所在对象中的其它synchronized数据可被别的线程使用。当调用sleep()方法时,该线程不会释放当前线程所占有的“锁标志”。 7.14 什么是死锁?什么情况下会死锁? 【答】由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁。

当多个线程同时被阻塞,他们中的一个或者全部都在等待某个资源被释放,由于线程被无限期地阻塞,因此程序处于非正常终止,才会产生死锁。

第9章 输入/输出流与文件操作

9.1 什么是流?流有什么用?面向对象语言为什么需要流?哪些场合需要流? 答:流是指一组有顺序、有起点和终点的字节集合,是对数据传输的总称或抽象(也就是数据在两个对象之间的传输称为流)。

流的作用就是使数据传输操作独立于相关设备。 在面向对象的程序设计中,数据的传输和流动具有广泛性,可以在内存与外部设备之间传输,还可以从内存到内存,甚至可以从一台计算机通过网络流向另一台计算机等,故面向对象语言采用流机制。

在标准输入/输出、在文件的读/写等操作中都需要流。

9.2 Java提供了哪些流类?各种流类之间的关系是怎样的?什么场合需要使用什么流类?

答:Java中按照流的方向性,流分为输入流和输出流两大类。按照流中元素的基本类型,流分为字节流和字符流两大类。字节流类按照流的方向分为字节输入流类和字节输出流类,字符流类方向性分为字符输入流类和字符输出流类。以及文件操作类File,随机存取文件类RandomAccessFile.

其中InputStream类是所有字节输入流的根类,OutputStream类是所有字节输出流的根类;Reader类是所有字符输入流的根类,Writer类是所有字符输出流的根类。

9.3 操作系统中文件和目录概念是怎么样的?Java提供了哪些对文件和目录操作的类?程序中对文件和目录能够进行哪些操作?如何操作?

答:文件是信息的一种组织形式,是存储在外部存储介质上的具有标识名的一组相关的信息集合。目录是文件系统组织和管理文件的基本单位,保存它所管理的每个文件的基本属性信息(称为文件目录项或文件控制块)。

Java直接对文件的顺序存取和随机存取操作,提供了File类记载文件属性信息,对文件读/写操作时以流的形式。RandomAccessFile类以随机存取方式进行文件读/写操作。但在对文件操作过程中还需要使用文件过滤器接口和文件对话框类。在操作系统中,

目录也是以文件的形式保存的,称为目录文件。故一个File对象也可以表示一个目录。

可以对文件进行读、写、删除、创建等操作,对目录可以读取、创建、删除等操作。应用程序通过调用操作系统提供的系统调用能够对文件及目录进行各种操作。

再打开、保存、复制文件时,需要读/写文件中的数据内容,这些操作由流实现,不同类型的文件需要使用不同的流泪。

9.4 流与文件操作有什么关系?实际应用中将流类与文件操作结合起来能够实现哪些复杂问题?如何实现?

答:对文件的操作时通过流这个工具进行的。再打开、保存、复制文件时,需要读/写文件中的数据内容,这些操作由流实现,不同类型的文件需要使用不同的流泪。

9.5 什么是输入/输出?什么是标准输入/输出?Java怎样实现标准输入/输出功能?

答:数据由外部设备流向内存,这个过程称为输入;数据有内存流向外部设备,这个过程称为输出。

在计算机系统中,标准输入是从键盘等外部输入设备中获得数据,标准输出是向显示器或打印机等外部输出设备发送数据。

Java在java.lang.System类中声明了3个常量in、out和err用于实现标准输入/输出

功能。

9.6 除了标准输入/输出及文件操作之外,还有那些应用中需要使用流? 答:在面向对象的程序设计中,数据的传输和流动具有广泛性,不仅可以在内存与外部设备之间传输,还可以从内存流向内存,甚至可以从一台计算机通过网络流向另一台计算机,因此各种不同的数据源的传输都需要采取不同的流机制来实现。

9.7 在“打开”、“保存”文件对话框中,设置“*.txt”等文件过滤器。 答: 略

9.8 RandomAccessFile类和与File类有什么不同,进行读写操作时需要使用流吗?

答:File类保存文件和目录的各种属性,在对文件的操作中,其中读/写文件的操作由字节流或字符流实现,通常是以顺序存取方式,如果要对文件进行随机存取即对一个文件同时进行读和写操作时就是用RandomAccessFile类。它们在读写操作时都要用到流。

9.9 能否将一个对象写入一个随机存取文件? 答:不能

9.10 Applet应用程序能否使用流与文件操作?为什么不能? 答:不能。

9.11 当创建文件流类或File类对象时,如果文件名为空,会怎样?会抛出异常吗?

答:NullPointerException

第10章 网络通信

10.1 什么是URL?Java提供哪些与URL有关的类?

答:URL指定在Internet上的某个信息资源的地址,包含协议、主机、端口和文件名。在Java中提供与URL有关的类有URLConnection类。

10.2 说明URL类与URLConnection类各有什么功能。

答:java.net.URL类表示URL地址,提供获得URL对象的协议名、主机名、端口号、文件名、和引用字符串等属性的方法,URLConnection类的一个对象就是Internet上的一个文件,文件名由URL地址指定,通过该文件对象可以获得指定文件的各种属性。

10.3 举例说明哪些是正确的URL,哪些URL中有错误。当URL中有错误时,程序会怎样?

http://localhost:1319/kfsoso/WebUI/Admin_main.html 都是答:http://www.google.cn 、

正确的URL,http://google.Com、localhost:/kfsoso/WebUI/Admin_main.Html就是错误的URL。

当URL地址有错误时,抛出MalfromedURLException异常。

10.4 什么是Socket通信?它有什么特点?参与Socket通信的主体是谁?

答:Socket通信时基于TCP连接的两个过程之间的端-端通信,TCP连接提供数据通信所需的字节流服务。特点是Socket通信是双向的、可靠的。

10.5 Socket通信的基础是什么?Socket通信是单向的还是双向的? 10.6 在Socket通信中,为什么需要指定端口号?端口号由谁指定?端口号的数据范围是怎样的?能够使用哪些端口号?

10.7 Java提供哪些类实现Socket通信?每个类提供哪些功能? 答:Java提供了ServerSocket类和Socket类,实现Socket通信。 ServerSocket类的功能:提供TCP连接服务、指定端口号等待客户端的连接请求停止客户端的连接请求;

Socket类的功能:制定主机地址和端口号,向服务器发出连接请求,连接服务器端和客户端并进行通信,建立字节输入/输出流,进行数据传输。

10.8 ServerSocket和Socket类中都有close()方法,两者有什么不一样?

ServerSocket类的close()方法:Server类的close()答:停止等候客户端的连接请求;

方法:关闭TCP连接。

第11章 数据库应用

11.1 什么是数据库?什么是数据库管理系统?什么是数据库系统?

【答】数据库是长期存储在计算机外存上的有结构的、可共享的数据集合。数据库管理系统是指数据库系统中对数据进行管理的软件系统,它是位于用户与操作系统之间的一层数据管理软件。数据库系统是采用数据库技术的计算机系统,包括数据库、数据库管理系统、应用程序、数据库管理员和用户。

11.2 什么是关系数据库系统?关系模型有哪些特点?用什么形式表达一个关系? 【答】关系数据库系统是支持关系模型的数据库系统。关系模型用二维表格表示实体,用关键码进行数据导航。通常用二维表表示表示一个关系。

11.3 在关系模型中,表由哪些成分组成?每个成分的作用是什么? 【答】表由若干列组成,每一列表示实体的一个属性。

11.4 什么是主键?主键表达关系的什么性质?为什么每张表都必须设计主键?使用主键时必须遵循什么完整性规则?怎样为一个表声明主键?

【答】主键是能够唯一标识实体的属性集。主键表达关系中实体的唯一性。每张表的主键用于区别表中的实体。使用主键时要遵循实体完整性规则。声明主键的语句如下:

sno char(9) primary key 该句表明列sno为表的主键。

11.5 什么是外键?外键表达关系的什么性质?在什么情况下需要设计外键?使用外键时需要遵循什么完整性规则?

【答】如果模式R中属性K是其他模式的主键,那么K在模式R中称为外关键字,简称外键。当两个表之间有联系时,应该设置外键。使用外键时应遵循参照完整性规则。

11.6 客户----服务器结构的关系数据库系统有什么特点?由哪几部分组成?各部分的功能是怎样的?划分各部分的基本原则是什么?

【答】客户—服务器结构的关系数据库系统的特点是数据集中,功能分布;由服务器和客户端组成;服务器完成DBMS的核心功能,客户端完成数据处理、数据表示、用户接口等功能;划分各部分的基本原则是将计算机应用任务分解成多个子任务,由多台计算机分工完成,即“功能分布”原则。

11.7 数据库应用程序为什么要连接数据库? 【答】数据库具有数据独立性的特点。数据独立性是指应用程序与数据库的数据结构之间相互独立。这样,应用程序能够访问不同的数据库,数据库也能够支持由不同开发工具所设计出来的应用程序。但应用程序不能直接存取数据库,所以应用程序要指定需要访问的数据库,就必须在访问前先建立与数据库的连接。

11.8 关系数据库的标准语言是什么?它有什么特点和功能?由哪几部分组成? 【答】 关系数据库的标准语言是结构化查询语言SQL; 关系数据库的主要特点:

⑴关系中的每个属性必须是不可分割的数据单元(即表中不能再包含表)。 ⑵关系中的每一列元素必须是类型相同的数据。 ⑶同一个关系中不能有相同的字段(属性),也不能有相同的记录。 ⑷关系的行、列次序可以任意交换,不影响其信息内容。 功能:处理数据库中的数据;

关系数据库由若干张表组成,表中记录一系列数据,除了数据之外,关系数据

库还可能包含安全信息和数据管理子程序。

11.9 SQL语言有哪些基本功能?对应的语句有哪些? 【答】基本功能:数据定义、查询、操纵和控制; 对应的语句有:

创建基本表:create table 表名 修改基本表:alter table 表名 删除基本表:drop table 表名 插入数据: insert into 表名 [(列1{,列2})] values (值1{,值2}) 修改数据:update 表名

set 列=表达式{,列=表达式} [where 条件表达式] 删除数据:delete from 表名 [where 条件表达式] 查询数据:select [all|distinct]

列表达式{,列表达式} from 表名

[where 条件表达式]

[group by 列 [having 条件表达式]] [order by 列 [asc|desc]]

11.10 什么是ODBC?它有什么特点和功能?在什么情况下需要使用并能够使用ODBC?

【答】ODBC是Microsoft公司于1992年提出的基于SQL的数据库连接标准。 特点:是一个分层体系结构,具有良好的互用性和可移植性; 功能:具备同时访问多种数据库的能力,从而克服了传统数据库应用程序的缺陷。

对用户来说,ODBC驱动程序屏蔽掉了不同数据库的差异;

如果要访问支持ODBC的数据库,而该数据库又在不支持OLE的服务器上,那

ODBC是Windows系统么ODBC是最好的选择,要处理SQL时也需要ODBC,

默认安装的一种工具,当安装成功Windows时,即安装了ODBC,在“控制面板”的“管理工具”中即可看到“数据源(ODBC)”,此时才能使用,在ODBC

下,必须人工执行全部所需的设置,另外ODBC也适用于Sun Solaris操作系统。

11.11 什么是JDBC?JDBC和ODBC有什么联系和区别?

【答】JDBC是基于java的,用于访问关系数据库的应用程序编程接口(API),提供在java应用程序中执行sql语句以访问和操作关系数据库的方法。

JDBC和ODBC一样都具有开放性,都具有管理各种数据库驱动程序的功能。ODBC是一个分层体系结构,由四部分组成:ODBC数据应用程序,驱动程序管理器,DBMS驱动程序,数据源。ODBC具有良好的互用性和可移植性,并且同时具备访问多种数据库的能力,从而克服了传统数据库应用程序的缺陷。

11.12 JDBC提供哪些类型的驱动程序?它们各有什么特点?举例说明哪些数据库需要采用哪种JDBC驱动程序?

【答】JDBC提供4种类型的驱动程序:

1,JDBC-ODBC桥驱动程序 特点:具有大量的ODBC驱动程序可用,缺点是不易于移植,且运行速度较慢。

2,本地库java实现驱动程序 特点:能够充分利用已有的专用驱动程序,缺点是不具有跨平台特性。

3,网络协议驱动程序 特点:适用于网络的分布式应用,方式灵活缺点是设计网络安全问题。

4,数据库协议驱动程序 特点:应用程序直接于数据库服务器端通信,此类驱动程序全部使用java编写。

11.13 在JDBC应用程序中执行一条SQL语句需要创建哪几个java对象?它们分别实现什么功能?

【答】 在JDBC应用程序中执行一条SQL语句需创建4个java对象, 分别为:

1,class.forName(““); //加载驱动

2,connection con=DriverManager.getConnection(““);//连接数据库 3,Statement stmt=con.createStatement();//创建statement对象 4,Result rs=stmt.exectuQuery(sql);//执行sql语句

11.14 在JDBC应用程序中执行数据更新或数据查询的SQL语句,将返回什么样的结果?

【答】执行数据库更新时返回影响的记录数,执行数据查询语句是返回查询的结果集 11.15为什么声明java.sql中接口变量就能使用相应实例?这些接口由谁实现?

【答】因为java.sql中提供了使用 Java 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。这些 接口由JDBC驱动程序完成。

11.16 什么是元数据?怎样获得数据库的元数据?怎样获得表中各列的元数据?

【答】元数据就是:metadata,广泛一点的说就是一个对象的属性信息,获得数据库元数据:通过DatabaseMetaData接口提供的方法,获得表中各列元数据:通过ResultSetMetaData接口提供的方法。

第12章JSP

12.1 什么是静态网页?什么是动态网页?区别的标识什么?

【答】静态网页是由用户使用文本编辑器创建和编辑的,通常这类网页中的内容不会改变,在浏览器中每次查看结果相同。动态网页是但浏览器访问Web服务器时由应用程序动态创建的,应用程序根据浏览器的不同要求,创建不同类型的HTML文档,由于对浏览器

每次请求的响应都是临时生成的,因此用户通过动态网页看到的内容可根据需要不断变化。

静态网页的后缀名通常为.htm、.html、.shtml、.xml,动态网页的后缀名通常为.asp、.jsp、.php、.perl、.cgi,因此二者的区别主要是后缀名不同。

12.2 什么是动态网页技术?它在服务器端执行还是在客户端执行?主要的特点是什么?

【答】动态网页技术是当浏览器访问Web服务器时,在服务器端执行应用程序,根据浏览器的不同请求,动态创建不同内容的HTML文档,再将该HTML文档返回给客户端的浏览器。它是在服务器端执行。主要特点是扩充了网页功能,增强了网页的动态特性。即使同一个Web页也会因用户不同的需求而显示出不同的内容。

12.3 什么是JSP?JSP有什么特点?JSP与java有什么关系?

【答】JSP是Sun公司推出的动态网页技术,它在HTML文档中直接嵌入Java语言,JSP的特点是平台无关性、运行效率高、可重用性强、数据库连接方便、安全性好。java是一种编程语言,和C语言有些相似, HTML也是一种编程语言,是用来做网站的页面的,如果把JAVA语言写进HTML语言里面,就是JSP。

12.4 简述其他动态网页的特点,并说明JSP具有哪些优势 【答】其他动态网页有ASP、PHP、PERL、CGI ASP的特点:

(1)ASP是一种程序语言,无须编译. (2)为纯文本文件. (3)独立于浏览器.

(4)源程序不会让客户端看到.

(5)可与任何ActiveX Script语言兼容使用. (6)实现复杂数据库操作. PHP的特点:

PHP是一种跨平台的服务器端的嵌入式脚本语言. 它大量地借用C,Java和Perl语言的语法, 并耦合PHP自己的特性,使WEB开发者能够快速地写出动态生成页面.它支持目前绝多数数据库。PHP是完全免费的,可以不受限制地获得源码,甚至可以从中加进自己需要的特色。

PERL的特点:

Perl 是按 GNU Public License 和 Artictic License 两种许可证形式分发的,其实质是开源软件、自由软件的,原先运行于 UNIX 和类 UNIX 系统,现在已可以方便地在OS/2,Windows 9x,Windows/NT等系统下运行。Perl 是一种解释运行的语言,和 BASH 程序一样,一般 Perl 程序的第一行需注明自己是一个 Perl 程序而不是 Shell 程序,所以一般将下面一行语句:#! /usr/bin/perl 作为文件的第一行。

CGI的特点:

运行速度快。做同样的事情Java开销较大,因此是解释执行的。

兼容性好。并非所有的浏览器都支持Java,而那些支持Java的浏览器也不能在所有平台上运行。

可以用任何一种你熟悉的高级语言如C、C++、C shell或VB来书写CGI程序。特别有一种叫Perl的语言,是现在写CGI,尤其是表单类程序的首选。 12.5 什么是Servlet?JSP与Servlet有什么关系?

【答】Servlet是用Java语言编写的、协议和平台都独立的服务器端组件,实现动态网Servlet使用的是Servlet API,页技术。不是Java的核心类库,没有包含在JDK中,它有Tomcat

提供。JSP是Servlet功能的扩充。

12.6 JSP技术与Applet有什么区别?

【答】applet是客户端的程序,它们可以直接嵌入到网页或者其他特定的容器中,并能够产生特殊的效果,servlet是服务端器的程序,用于实现服务器功能的扩充,响应客户端请求,JSP则是对servlet简化,用于方便输出动态页面。

12.7 JSP文档与HTML文档有什么关系?JSP文档能够在JDK中运行吗?它需要在什么环境中运行?

【答】在HTML文档中嵌入Java语言,记得到JSP文档,JSP文档的文件扩展名为.jsp. 要正常使用jsp必须安装jdk,还需要安装jsp服务器,一般常用的有tomcat resin。运行环境:Web服务器和JSP容器

12.8 什么是JSP容器?它安装在哪里?具有什么功能?

【答】JSP容器:JSP Container ,安装在Apache服务器上,JSP容器是将JSP转化成Servlet应用程序,并为Servlet提供运行环境的程序。

12.9 简述JSP文档的执行过程 【答】执行过程如下:

1.客户端浏览器发出jsp页面请求。

2.web服务器搜索到指定jsp文档转交jsp容器处理。

3.jsp容器将jsp文档转换成Servlet应用程序,将Servlet应用程序编译成java类文件(.class),执行servlet的类文件。

4.servlet运行时,根据客户端请求参数,返回执行结果的动态HTML文档。 12.10 JSP文档由谁对其进行编译、执行?在什么时候进行编译?第一次执行与其后的执行有什么不同?

【答】jsp文档由JSP容器编译执行,当web服务器搜索到指定的JSP文档转交jsp容器时将jsp文档转换成Servlet应用程序,将Servlet应用程序编译成java类文件(.class),执行servlet的类文件。第一次执行时需要编译,其后执行不需要编译。

12.11 基于JSP的Web应用结构有什么特点?

【答】基于JSP的Web应用结构有两种:两层浏览器/服务器结构,三层浏览器/服务器结构

12.12 JSP中定义了哪些标记?它们扩展了HTML语言的哪些功能? 【答】 声明标记,表达式标记,注视标记 如下: <%-- --%> <%= %> <%! %> <% %> <%@ %> 注释语句 表达式(求值)语句 声明语句 <%-- This is comment --%> <%= new Date() %> <%! Date myD = new Date(); %> <% for(int i=0;i<10;i++) %> <%@ page import=\代码语句 指令语句 Jsp可以实现动态创建网页。

12.13 JSP有哪些隐含对象?各对象的作用是什么?

【答】jsp隐含对象:application, session,out,request,response 各对象的作用:

通过request对象,可以取得客户端提交的数据信息,以及web服务器的参数。 Response对象包含服务器向客户端做出的应答信息。 Out对象用于在jsp文档的scriplet中输出数据。 Application 对象保存服务器端的jsp容器信息。 Session对象保存客户端的浏览器信息。

12.14 什么是application对象?什么是session对象?两者之间有何差别?

【答】application对象属于javax.servlet.ServletContext接口,session对象属于javax.servlet.http.HttpSession接口。

差别:Session是在站点的页面从打开到被关闭之前一直生存的,关闭或跳转到其它网站就会使Session死掉。而Application是从站点发布以来一直存活的,除非重启了站点服务,IIS。

从作用域为讲:Session是对应某一个用户的。而Application是整站共用的。

12.15 什么是request对象?什么是response对象?两者之间有何差别?

【答】 Request 对象在 HTTP 请求期间,检索客户端浏览器传递给服务器的值。 Response对象是用来控制发送给用户的信息,包括直接发送信息给浏览器,重定向浏览器到另一个URL或设置cookie的值。

request是请求,response是响应,区别:即客服端发来的请求、是服务器做出的响应。

12.16 什么是JavaBeans?它与Java和JSP有什么关系?通常在什么场合需要使用JavaBeans技术?

【答】JavaBeans是Java的对象组件技术,提供组件复用的关键技术,使用javabeans技术需要两方面:先设计javabeans所属的java类,然后在jsp文档中使用jsp操作命令声明javaBeans并为其设置属性,在jsp文档中使用的javaBeans名称是其所属类的实例,通过设置javaBeans的各种属性值,可以改变javaBeans的状态。当需要对组件重复使用时要使用javaBeans技术。