
Java_课后习题答案.pdf
138页第1章Java概述[ 11为什么说Java的运行与计算机硬件平台无关?[ 解答] : Java编译器能够产生一种与计算机体系结构无关的字节指令( Byte Code) , 只要安装了 Java虚拟机,Java就可以在相应的处理机上执行利用Java虚拟机就可以把Java字节码程序跟具体的操作系统以及硬件平台分隔开来[ 2] Java有什么特点?[ 解答] :Java的特点有:( 1)简单性;( 2)面向对象;( 3)跨平台性;( 4)健壮性;( 5)安全性;( 6)可移植性;( 7)多线程性;( 8)动态性[ 3]试述Java开发环境的建立过程[ 解答] :Java开发环境的建立过程如下:1. JDK的下载与安装:从htlp://下载最新版的JD K ,单击下载后的文件即出现安装界面;在此界面中打击“next” 按钮即可;2. JD K 的配置:安装好JD K 后,设安装路径为c:\ jdkl.5;还需要在环境变量中进行对应的配置下面以Windows操作系统为例来进行配置1)设置JAVA_HOME环境变量: 在桌面上用鼠标右键单击“ 我的电脑” , 依次选择“ 属性” 、“ 高级”、 “ 环境变量”选项,新建一个系统变量,名称为JAVA_HOME,值为叫dkl.5;2)设置CLASSPATH环境变量, 设置方法和JAVA_HOME 一样, 其值为c:\ jdkl ,5\ lib\ tools.jar;.;3)更新PATH环境变量的值,编辑PATH系统变量,在最后添加c:\ jdkl.5\ bin;.。
[ 4 1 什么是Java A PI?它提供的核心包的主要功能是什么?[ 解答] :Java A PI就是Java所提供的标准类库,它把程序设计所需要的常用的方法和接口分类封装成包在 Java A PI中主要包括核心java包、javax扩展包和org扩展包等核心java包中封装了程序设计所需要的主要应用类[ 5]如何编写和运行Java应用程序?[ 解答] :Java应用程序的编写和运行过程:1 . 建立Java源文件:首先创建Java的源代码,即建立一个文本文档,包括有符合Java规范的语句2 . 编译源文件: “ 编译”就是将一个源代码文件翻译成计算机可以理解和处理的格式的过程 Java源程序编译后会生成一个字节码文件,即带扩展名class的文件 Java字节码文件中包含的使Java解释程序将要执行的指令码3 . 执行字节码文件:通过Java虚拟机运行字节码文件[ 6]为什么要为程序添加注释,在Java程序中如何为程序添加注释?[ 解答] : 注释是程序中的说明性文字,是程序的非执行部分它的作用是为程序添加说明,增加程序的可读性Java使用以下二种方式对程序进行注释:1. " / / ”符号,它表示从“ / / ”符号开始到此行的末尾位置都作为注释。
2. 符号,它表示从“ / * ”开始至!| “ * / ”结束的部分都作为注释部分,可以使多行注释[ 7] Java工具集中的javac、java、appletviewer各有什么作用?[ 解答] :javac的作用:它是Java编译器,用于将Java源程序编译成字节码文件;java的作用:它是Java解释器,用于解释执行Java字节码文件;appletviewer的作用:Applet程序浏览器,用于测试和运行Applet程序[ 8]如何建立和运行Java Applet程序?[ 解答] :J a v a A p p l e t程序的建立和运行过程:1 .建立J a v a源文件:首先创建J a v a的源代码,即建立一个文本文档,包括有符合J a v a规范的语句2 .编译源文件:将J a v a源文件编译成.C l a s s的字节码文件,然后再将字节码文件嵌入到一个HTML文件中3 .利用浏览器解释执行h t m l文件第2章Java基础[1]什么是数据类型?为什么要将数据划分为不同的数据类型?[ 解答] :J a v a是一门强类型语言数据类型是用来区分不同的数据;由于数据在存储时所需要的容量各不相同, 不同的数据就必须要分配不同大小的内存空间来存储, 所有就要将数据划分成不同的数据类型。
[ 2 ] J a v a中有哪些数据类型?[ 解答] :J a v a中有8种基本数据类型: 字节型( b y t e ) ,短整型( s h o r t ) ,整型( i n t ) ,长整型( l o n g ) ,字符型( c h a r ) ,单精度型( f l o a t ) ,双精度型( d o u b l e ) ,布尔型( b o o l e a n )[ 3]声明变量的作用是什么?[ 解答] : 变量时一个数据存储空间的表示,将数据指定给变量,就是将数据存储至对应的内存空间,调用变量,就是将对应的内存空间的数据取出来使用声明变量就是申请一个内存空间[ 4]若x =4 ,y =2,计算z 值:( 1) z = x & y( 2) z =x | y( 3 ) z =xAy( 4 ) z= x» y( 5 ) z = ~ x( 6 ) z = x« y( 7 ) z = x» > y[ 解答] :p u b l i c c l a s s T e s t _ 4 {p u b l i c s t a t i c v o i d m a i n ( S t r i n g [ l a r g s ) {i n t x = 4 , y = 2, z ; 〃初始化x ,y ,zz = x & y ; 〃求z =x & y ;即x与y的值S y s t e m . o u t . p r i n t l n ( ',4 _ l : " + z ) ;z = x | y ;/ /求z =x | y ;即x 或y 的值S y s t e m . o u t . p r i n t l n (n4 _ 2: " + z ) ;z 二 x八y ; 〃求z =x ^ y ;即x异或y的值S y s t e m . o u t . p r i n l l n ( " 4 _ 3 : " + z ) ;z = x » y ; 〃求z = x » y ;即x右移y位的值S y s t e m . o u t . p r i n l l n ( " 4 _ 4 :n+ z ) ;Z = ~X ; 〃求Z =~X ;即X位反的值S y s t e m . o u t . p r i n t l n ( " 4 _ 5 : " + z ) ;z = x v v y ; 〃求z = x « y ;即x左移y位的值S y s l e m . o u t . p r i n l l n ( " 4 _ 6 : " + z ) ;z = x > » y; 〃求z=x»>y;即x 无符号右移y 位的值System.oul.prinUn("4_7:"+ z);))[5 ]假设x=10, y=20, z=30,求下列布尔表达式的值:(l)x<10| | x<10⑵ x>y && y>x(3) (x 表达式可用于计算一个格式,位变量赋值以及帮助控制程序执行流程语句:语句组成了一个执行程序的基本单元,类似于自然语言的句子包括表达式语句、复合语句、控制语句等[ 7] Java有哪些数据类型?请描述其分类情况[ 解答] :Java定义了8 个基本数据类型:字节型,短整型,整型,长整型, 字符型,浮点型,双精度型,布尔型它们分为4 组:1 )整 数 型 ( byte, short, int, long)2 )浮点数型(float, double)3 )字 符 型 (char)4 ) 布 尔 型 (boolean)[ 8]试比较break和continue语句的区别?[ 解答] :Break:强行退出循环,忽略循环体中的任何其他语句和循环的条件的条件测试Continue:语句用来终止本次循环其功能是终止当前正在进行的本轮循环,即跳过后面剩余的语句,转而执行循环的第一条语句,计算和判断循环条件,决定是否进入下一轮循环[ 9]有一函数:厂 x (x [ 解答] : Do- while与while语句的主要区别在于, 先执行循环体中的语句再计算条件表达式,所以do・ while语句的循环体至少执行一次[1 1 ]写出下列语句执行后的结果:for (k=l;k<=5;k+ + )if (k>4) break;System.out.printlnCck= ,,+ k);)[ 解答] :public class Test_l 1 {public static void main(String[] args) {int k;for (k = 1; k <= 5; k+ + ) {if(k>4)break;System.out.println(',k=,' + k);【 12】 编写程序, 求 三 好 的 值 [ 解答] : Wpublic class Test_12 {public static void main(String[] args) {int k,sum=0;for(k=l;k<=10;k+ + ){sum=sum+ k*k;)System.out.println(',sum=',4- sum);})[1 3 ]编写一程序,输入3 个数,能按大小顺序输出。 [ 解答] :import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class Test_13 {public static void main(String[] args) throws NumberFormatExceptionJOException(InputStreamReader isr = new InputStreamReader(System.in);BufferedReader br = new BufferedReader(isr);int a[] = new int[3];int k, temp;System.oul.prinlln( ” 请输入3 个数字( 每输入一个数字后请换行) ” ) ;for (int i = 0; i < 3; i+ + ) {a[i] = Integer.parselnt(br.readLineO);for (int i = 0; i < a.length; i+ + ) {k = i;for (int j = k + 1; j < a.length; j+ + ) {if(a[j]
[ 解答] :public class Test_14 {public static void main(String[] args) {int m, k, i, n = 0;for (m = 2; m <= 100; m=m+ + ) {for (i = 2; i <=m; i+ + )if (m % i == 0) {break;)if (m=i) {System.out.print(m + “ ”);n = n + 1 ;)if (n % 10 == 0)System.out.println();)))【 15】运行下面程序,并分析其执行过程:Public class multiplication {public static void main(String args[ ] ){int i,j;for (i=l;i<10;i+ + ){for(j=l;j<10;j+ + ){System.out.print(i+ **”+ j+ *="+ i*j+ "”);System.out.println();}})[ 解答] :public class Test_15 {public static void main(String[] args) {int i,j;for (i= l;i< 10; i+ + ) {for(j = l;j<=i;j++) {System.out.print(i + + j + ,,=n + i * j + ")System.out.printlnO;结果:1*1=12*1=2 2*2=43*1=3 3*2=6 3*3=94* 1=4 4*2=8 4*3=12 4*4: 165*1=5 5*2=10 5*3=15 5*4=20 5*5=256* 1 =6 6*2= 12 6*3= 18 6*4=24 6*5=30 6*6=367*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=498*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=649*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81乘法表*/【 16】编写程序实现:输入一组整数,比较并输出其中的最大值和最小值,再将数组元素从小到大排序并将运行结果输出。 [ 解答] :import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class Test_16 {public static void main(String[] args) throws NumberFormatExceptionJOException {InputStreamReader isr = new InputStreamReader(System.in);BufferedReader br = new BufferedReader(isr);int a[] = new int[5];int k, temp;System.out.println( ” 请输入5 个数字( 每输入一个数字后请换行) ” ) ;for (int i = 0; i < 5; i+ + ) {a[i] = Integer.parseInt(br.readLine());)for (int i = 0; i < a.length; i+ + ) {k = i;for (int j = k + 1; j < a.length; j+ + ) {if(aU]
$ $$[ 解答] :public class Test_17_l {public static void main(String[] args) {int i, j;for (i = 1; i <= 4; i+ + ) {for(j = l; j <= i; j+ + ) ]System.out.print("#n + u ");)System.out.println();public class Test_17_2 {public static void main(String[] args) {int i,j,k;for (i = 0; i < 4; i+ + ) {for (k = 0; k < i; k+ + ) {System.out.print(u n);)for(j = 0;j<=6-2*i;j++)System.out.print("*");System.out.printlnO;)})public class Test_17_3 {public static void main(String[l args) {int i=0,blank,j,star,input=5;//input 是输入的行数String s=,H,;for( i = 0;i < input; i+ + )(blank. = Math.abs( i - input/2);for( j = 1 ; j <= blank; j+ + )s + = " ” ;star = input - 2 * blank;for( j = 1; j <= star ; j+ + )s + = " $ ” ;s + 二 "\ n” ;)System.out.print( s);))[1 8 ]考虑一个2 X 3 的数组a。 1)为a 写一个设声明试问,这样的声明使a 有多少行,多少列,多少元素?(2)写出a 的第1 行的所有元素的名字3)写一条语句,置行1 歹 U2的元素为零4)写一个嵌套for结构,将a 的每个元素初始化为零5)定一条语句,求第3 列元素的和[ 解答] :(1)数组a 有2 行,3 列,元素个数为6(2)第一行元素的名字为a[0][0],a⑼ [l],a⑼⑵(3)置行1 列2 的元素为0,语句是a阿 1]=0;(4)for(int i=0;i<2;i+ + ){for(inj=0;j<3;j+ + ){a[i]Ul=0;(5)int sum=O;sum=a[O] [2]+ a[ 1 ] [2];[1 9 ]求3X 3矩形对角元素之和[ 解答] :public class Test_19 {public static void main(String[] args) {int i, j, sum = 0;int a[][] = new int[3][3];for (i = 0; i < 3; i+ + ) {for(j = 0;j <3;j++) {a[i][j] = i+j;〃输出二维数组for (i = 0; i < 3; i+ + ) {for(j = 0;j <3;j++) {System.out.print(a[i][j] + " ”);)System.out.println();)〃显示对角线之和for (i = 0; i < 3; i+ + ) {sum = sum + a[i][i];)System.out.primln( " 对角线之和:" + sum);))[2 0 ]编写一程序,查找某一字符串是否包含有“abc” 。 [ 解答] :public class Test_20 {public static void main(String[] args) {String s = Myangen abcM;int a = s.indexOf(nabcH);//a位找到abc的下标,找不到则返回if(a!=-l) {System.out.print( ” 包含字符串 abc");} else {System.out.print( " 不包含字符串 abc");【 21】设一字符串中包含有大写字母的字符,也有小写字母的字符,编写一程序,将其中的大小写字母的字符分别输出[ 解答] :public class Test_21 {public static void main(String[ | args) {String s="sdfKJjKjjsjdfKKJkjkjSDFsdr;String sl=n,*,s2='H,,s3;fbr(int i=O;i 单词之间用空格分隔) [ 解答] :import java.util.*;public class Test_22 {public static void main(String[ ] args) {int i = 0;String s = "Hello world i love java";StringTokenizer st = new StringTokenizer(s,"");while (st.hasMoreTokens()) {i+ + ;System.out.prinlln(st.nextToken());)System.oul.print( " 单词个数:” + i);))第3章面向对象程序设计基础[ 1]什么是Java程序使用的类?什么是类库?[ 解答] : Java程序的基本单位是类对象是对事物的抽象, 而类是对对象的抽象和归纳, 找出事物的共性, 把具有共同性质的事物归结为一类, 得出一个抽象的概念一一类 类是具有相同属性和方法的一组对象的集合,类是在对象之上的抽象,对象则是类的具体化,一旦建立类之后,就可用它来建立许多你需要的对象J a v a 的类库是系统提供的已实现的标准类的集合,是J a v a 编程的A P I (A p p l i c a t i o nP r o g r a m I n t e r f a c e ), 它可以帮助开发者方便、快捷地开发J a v a 程序。 [ 2]如何定义方法?在面向对象程序设计中方法有什么作用?[ 解答] : 方法的定义由两部分组成:方法声明和方法体方法声明的基本格式如下:返回类型方法名(形式参数)(… 〃方法体内容}方法声明包括方法名、返回类型和形式参数,方法的小括号是方法的标志;方法体为实现方法行为的J a v a 语句在面向对象程序设计中,方法所起的作用是完成对类和对象属性操作 3】 简述构造方法的功能和特点 下面的程序片段是某学生为st u d e n t 类编写的构造方法,请指出其中的错误v o i d S t u d e n t (i n t n o , S t r i n g n a m e )(st u d e n t N o = n o ;st u d e n t N a m e = n a m e ;r e t u r n n o ;)[ 解答] : 构造方法是一个特殊的方法,主要用于初始化新创建的对象构造方法的方法名要求与类名相同,用户不能直接调用,只能通过n e w 运算符调用,而且构造方法是不返回任何数据类型,甚至也不返回v o i d 数据类型,即不能在构造方法前加v o i d 。 以上的代码段出错于:①构造方法S t u d e n t 前不能加v o i d ②不能用r e t u r n 语句[ 4]定义一个表示学生的st u d e n t 类,包括的域有学号、姓名、性别、年龄,包括的方法有获得学号、姓名、性别、年龄及修改年龄编写J a v a 程序创建st u d e n t 类的对象及测试其方法的功能[ 解答] : 程序代码段如下:c l a ss st u d e n t {p r i v a t e S t r i n g i d ;p r i v a t e S t r i n g n a m e ;p r i v a t e S t r i n g se x ;p r i v a t e i n t a g e ;p u b l i c S t r i n g g e t l d (){ r e t u r n i d ; }p u b l i c S t r i n g g e t N a m e ( ){ r e t u r n n a m e ; }p u b l i c S t r i n g g e t S e x (){ r e t u r n se x ; }p u b l i c i n t g e t A g e (){ r e t u r n a g e ; }v o i d se t A g e (i n t a g e ){ t h i s, a g e = a g e ; }p u b l i c c l a ss T e st S t u d e n t{ p u b l i c st a t i c v o i d m a i n (S t r i n g a r g s[] ){ st u d e n t st u = n e w st u d e n t (“ 040139 8” , " 杨小明〃," 男” , 20);S y st e m , o u t . p r i n t I n (z zst u d e n t i n f o : + “ \ n 学号:, z+st u . g e t l d ()+ 〃 \ n 姓名” +st u . g e t N a m e () +z z\ n 性别:〃 +st u . g e t S e x ()+ 〃 \ n 年龄:〃 +st u . g e t A g e O );st u . se t A g e (19 );S y st e m . o u t . p r i n t I n (〃修改后的年龄为:〃 +st u . g e t A g e ());))[ 5 ] 扩充、修改程序。 为第4 题的st u d e n t 类定义构造函数初始化所有的域,增加一个方法p u b l i c S t r i n g p r i n t l n f o ()把st u d e n t 类对象的所有域信息组合形成一个字符串,并在主类中创建学生对象及测试各方法的功能[ 解答] :程序代码段如下:c l a s s s t u d e n t (p r i v a t e St r i n g i d ;p r i v a t e St r i n g n a m e ;p r i v a t e St r i n g s e x ;p r i v a t e i n t a g e ;s t u d e n t (St r i n g i d , St r i n g n a m e , St r i n g s e x , i n t a g e ){ t h i s , i d = i d ;t h i s , n a m e = n a m e ;t h i s , s e x = s e x ;t h i s , a g e 二 a g e ;)p u b l i c St r i n g g e t l d O{ r e t u r n i d ; }p u b l i c St r i n g g e t Na m e ( ){ r e t u r n n a m e ; }p u b l i c St r i n g g e t Se x ( ){ r e t u r n s e x ; }p u b l i c i n t g e t Ag e ( ){ r e t u r n a g e ; }v o i d s e t Ag e (i n t a g e ){ t h i s , a g e = a g e ; }p u b l i c St r i n g p r i n t i n f o 0{ St r i n g s = " s t u d e n t i n f o : 〃 + 〃 \ n 学号:〃+i d + 〃 \ n 姓名〃+n a m e +〃\ n 性别:" +s e x + “ \ n年龄〃+a g e ;Sy s t e m , o u t . p r i n t i n (s );r e t u r n s ;))p u b l i c c l a s s Te s t St u d e n t{ p u b l i c s t a t i c v o i d m a i n (St r i n g a r g s [ ] ){ s t u d e n t s t u = n e w s t u d 6n t (“ 0401398〃 ,〃 杨小明" ,〃 男 " , 20);s t u . p r i n t i n f o 0 ;stu. setAge (19);stu. printinfo();)}[ 6]什么是修饰符?修饰符的种类有哪些?它们各有什么作用?[ 解答] :修饰符是用于限定类对象使用的权限,从而实现类中成员的信息隐藏。 访问修饰符适用于类成员,而不是方法内部的局部变量Java常见的访问修饰符有这4种:private、default- , protected 和public1) public可以被所有的类访问(2) pravite只能被类本身访问,其他类无法访问(3) protected可以被类本身、它的子类(包括同一个包中以及不同包中的子类)(4) default属于默认的访问状态,可以被类本身和同一个包中的类访问[ 7]什么是抽象类?为什么要引入抽象类的概念?[ 解答] :抽象类是用来描述人们在对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同, 但是本质上相同的具体概念的抽象抽象类不具备实际功能,是专门设计用来让子类继承的类, 把这些具有共同特征的方法抽象出来,由子类负责这些抽象方法的实现细节,而父类仅提供此方法的名称和声明、没有方法的主体,该类[ 8]什么是抽象方法?如何定义、使用抽象方法?[ 解答] :用abstract关键字修饰的方法称为抽象方法. 抽象方法定义时,需在方法名前加上关键字abstract,抽象方法只有方法声明,没有代码实现的空方法因此,必须通过其子类来重写父类中定义的每一个抽象方法。 [ 9]包的作用是什么?如何在程序中引入已定义的类?使用已定义的用户类、系统类有哪些主要方式?[ 解答] :包的作用是将类和接口封装在一起,方便了类和接口的管理和调用要引入包中已定义的类,必须用关键字import来导入这些类所在的包import语句的一般形式如下:import包名. 类名其中类名可以用通配符“ * ”代替使用已定义的用户类、系统类主要有三种方式:直接调用、继承和创建己定义的用户类、系统类的对象但无论采用哪种方式,使用已定义的用户类、系统类的前提条件是用户类、系统类应该是用户程序可见的类,为此用户程序需要用import语句引人它所用到的用户类、系统类或用户类、系统类所在的包[ 10]什么是继承?如何定义继承关系?[ 解答] : 同类事物具有共同性,在同类事物中,每个事物又具有其特殊性运用抽象的原则舍弃对象的特殊性, 抽取其共同性,则得到一个适应于一批对象的类, 这便是基类( 父类) ,而把具有特殊性的类称为派生类( 子类) ,派生类的对象拥有其基类的全部或部分属性与方法,称作派生类对基类的继承派生类继承基类,必须使用关键字extends来声明比如派生类B继承基类A ,派生类B定义的一般形式如下:class B extends A{ , •, )【11】什么是多态,如何实现多态?[ 解答] : 多态是指一个程序中同名的不同方法共存的情况。 这些方法同名的原因是它们的最终功能和目的都相同, 但是由于在完成同一功能时,可能遇到不同的具体情况,所以需要定义含不同的具体内容的方法, 来代表多种具体实现形式 多态通常是一个消息在不同的类中用不同的方法实现的多态的实现是由消息的接收者确定一个消息应如何解释, 而不是由消息的发送者确定, 消息的发送者只需要指导另外的实例可以执行一种特定操作即可J a v a 中提供两种多态机制:方法重载与方法重写[ 1 2 ]解释th i s 和s u p e r的意义和作用[ 解答] : th i s 指的是引用当前对象或类名称,当一个类的实例变量名与一个方法中参数名相同时,则参数就隐藏了实例变量名,此时可通过使用关键字th i s 来访问它;s u p e r用来引用当前对象的父类, 通过s u p e r来访问父类被子类隐藏的成员变量、 成员方法以及父类的构造方法由于子类不继承父类的构造方法,可使用s u p e r来调用父类的构造方法,并且s u p e r必须是子类构造方法中的第一条语句[ 1 3 ]什么是接口?为什么要定义接口?接口和类有什么异同?[ 解答] : 接口是用来调节各类之间的相互关系的一种结构,接口是抽象类的一种,只包含常量和方法的定义,而没有变量和具体方法的实现,且其方法都是抽象方法。 接口定义的格式如下:[ p u b l i c ] i n te rf a c e 接 口 名 [ e x te n d s 父接口名列表] {… 〃接口体}e xt e n ds 子句有类声明的e xt e n ds 子句基本相同, 不同的是一个接口可有多个父接口, 用逗号隔开,而一个类只能有一个父类J a v a 中的类只能实现单重继承,这虽然可以简化编程,但毕竟没有完全实现面向对象的功能 定义接口的主要作用, 就是帮助J a v a 实现类间多重继承的结构而且接口还有以下好处:•接口可以被多个类所实现,这些类可以不相关,从而具有相同的行为•通过接口可以了解对象的行为,而无需了解对象所对应的类的结构 1 4 】将一个抽象类改写成接口,并实现这个接口[ 解答] : 程序代码段如下:/ / 抽象类的应用示例a b s t r a ct cl a s s 动物{ p ub l i c a b s t r a ct v oi d cr y( ) ; }cl a s s 狗 e xt e n ds 动物{ p ub l i c v oi d cr y( ){ S ys t e m , out . p r i n t i n ( " 汪汪. . . ." ) ;}}cl a s s T e s t{ p ub l i c s t a t i c v oi d m a i n ( S t r i n g a r g s [ ] ){ 动物 don g w u;don g w u= n e w 狗 ( ) ;don g w u. cr y ( ) ;})〃将抽象类改写成接口,并实现这个接口i n t e r f a ce 动物{ p ub l i c v oi d cr y( ) ; }cl a s s 狗 i m p l e m e n t s 动物{p ub l i c v oi d cr y( ){ S ys t e m . out . p r i n t i n ( " 汪汪. . . . " ) ;})cl a s s T e s t{ p ub l i c s t a t i c v oi d m a i n ( S t r i n g a r g s [ ] ){ 动物 don g w u;don g w u= n e w 狗 ( ) ;don g w u. cr y ( ) ;})[ 1 5 ]编写一个程序实现包的功能。 [ 解答] : 包的功能实现包括两步骤:打包、引用包,其具体实现如下:( 1 ) 〃设当前运行目录的子目录t e s t ' b a g 下有M yB a g . cl a s s 类,其源程序如下:p a ck a g e t e s t , b a g ;p ub l i c cl a s s M yB a g(p ub l i c v oi d p r i n t ( ){ S ys t e m . out . p r i n t i n ( " 包的功能测试" ) ; })( 2 ) / / 在当前目录的T e s t B a g . j a v a 中,要使用子目录t e s t ' b a g 下有M yB a g . cl a s s 类中的p r i n t ( )〃方法,其源程序如下:i m p or t t e s t . b a g . M yB a g ;p ub l i c cl a s s T e s t B a g{ p ub l i c s t a t i c v oi d m a i n ( S t r i n g a r g s [ ] ){ M yB a g m b = n e w M yB a g ( ) ;m b . p r i n t ( ) ;)}[ 1 6 ]填空:( 1 ) 如果类A继承了类B,则类A被 称 为 一 类 ,类B被称为…类。 [ 解答] : 子 父( 2 ) 继承使— 成为可能,它节省了开发时间[ 解答] : 代码复用( 3 ) 如果一个类包含一个或多个a b s t r a ct 方法,它就是一个_ _ _ _ 类[ 解答] : 抽象( 4 ) 一个子类一般比其超类封装的功能要一[ 解答] : 强( 5 ) 标记成—的类的成员不能由该类的方法访问[ 解答] :s t a t i c( 6 ) J a v a 用关键字—指明继承关系[ 解答] :e xt e n ds( 7 ) t h i s 代表了 _ —的引用[ 解答] : 当前对象( 8 ) s up e r 表示的是当前对象的_ _ _ 对象[ 解答] : 父类(9 )抽象类的修饰符是一[ 解答] :abstract(10)接口中定义的数据成员是一[ 解答] : 常量(11)接口中没有什么—方法,所有成员方法都是一方法[ 解答] : 实 例 空第4章图形用户界面设计[ 1]什么是图形用户界面?试列举出图形用户界面中你使用过的组件[ 解答] : 图形用户界面或图形用户接口(Graphical User Interface, GUI)是指采用图形方式显示的计算机操作环境用户接口。 与早期计算机使用的命令行界面相比,图形界面对于用户来说更为简便易用 ( 比如你用windowsXP和使用D O S操作系统的差别) G U I是事件驱动的,也就是说,一旦用户与G U I交互,G U I组件就会生成” 事件“( 动 作 ) 常见交互包括移动鼠标、单击鼠标按钮、在文字段输入、从菜单选择一个选项以及关闭一个窗口等等在windwosXP的G U I中,使用过窗口,菜单条,按钮等[ 2]简述Java的事件处理机制什么是事件源?什么是监听者?在Java的图形用户界面中,谁可以充当事件源?谁可以充当监听者?[ 解答] : java的事件处理机制就是,事件源允许监听器注册的事件对象,在事件发生的时候想相关的注册对象发送一个,事件对象,监听器便根据相关的信息来选择运行相关的代码事件源:英文名为event source,是指事件发生的地方,也就是引起事件的组件,按钮Button,文本组件等都可以当做事件源比如说,你点击一个button,那么button就是事件源,要想使button对某些事件进行响应,你就需要注册特定的监听者 ( 具体请看第5 章的事件处理)监听者:英文名为event handler事件处理者,又叫监听器。 具体的对监听的事件类,当它监听到event object产生的时候,它就调用相应的方法,进行处理在java中,AW T组件和swing组件都可以当做事件源;java.awt.event.*,里面各种类都可以为监听者[ 3]动作事件的事件源可以有哪些?如何响应动作事件?[ 解答] : 动作事件的事件源可以有:Button,JButton,Menuitem,等响应动作事件的过程一般为:声明和实例化事件源,如: Button btn=new Button( “ 确定” ) ;注册监听:btn.addActionListener(lhis); //this指明是在当前类实现处理实现接口 : public void actionPerformed(ActionEvent e){〃 具体代码} ;[ 4]说明文本框与标签之间的区别[ 解答] : 文 本 框 ( TextField)和标签(Label)都可以进行文字表达TextField允许用户编辑单行文本的文本组件, 他可以添加相应的监听事件; 而Label对象是一个可在容器中放置文本的组件一个标签只显示一行只读文本文本可由应用程序更改, 但是用户不能直接对其进行编辑。 [ 5]编写程序包含一个标签、一个文本框和一个按钮,当用户单击按钮时,程序把文本框中的内容复制到标签中[ 解答] :Test4_5.javaimport java.awt.*;import java.awt.event.*;public class Test4_5 extends Frame implements ActionListener{Label lb;TextField txtFl;Button btn;public Test4_5(){/ / 界面布局和初始化super( " 文本框和标签的练习)setSize(260,200);setVisible(true);setLayout(new FlowLayout());lb=newLabel(" ");〃用空格占位, 以防止label个别字符出现问题txtFl=new TextField(20);btn=new Button( " 显示字符)add(txtFl);add(btn);add(lb);addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent we){System.exit(O);} } ) ;validate();〃增加监听btn.addActionListener(this);)public void actionPerformed(ActionEvent e){String strtmp=txtFl.getText();Ib.setText(strtmp);Ib.setForeground(Color.red);)public static void main(String[] args){new Test4_5();1)[6 ]设计一个加法计算器,如图4.25所 示 ( 课本P . ) , 在文本框中输入两个整数,单击按钮时,在第三个文本框中显示这两个数据的和。 [ 解答] : Test4_6.javaimport java.awt.*;import java.awt.event.*;class Test4_6 extends Frame implements ActionListener {TextField txtFll,txtF12,txtF13;Button btn;public Test4_6(){super( " 简单加法运算器)setSize(300,200);setVisible(true);setLayout(new FlowLayoutO);txtFll=new TextField(5);txtF12=new TextField(5);txtF13=new TextField(lO);btn=new Button("=n);add(new Label 请输入整数" ) ) ;add(txtFll);add(new Label(M+u));add(txtF12);add(btn);add(txtF13);addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent we){System.exit(O);} } ) ;validate();btn.addActionListener(this);)public void actionPerformed(ActionEvent e){int add=Integer.parseInt(txtFl 1 .getText())+ Inleger.valueOf(txtF12.getText()).intValue();〃 两种字符串转整形的方法txtF13.setText(String.valueOf(add));)public static void main(String[ ] args){new Test4_6();)}[ 7]说明文本框与文本区之间的区别,它们都可以引发什么事件?如何响应此事件?[ 解答] :TextField对象是允许编辑单行文本的文本组件。 TextArea对象是显示文本的多行区域可以将它设置为允许编辑或只读TextFiled 和TextArea 可以引用KeyEvent,ActionEvenl,分别用使用组件的 addKeyListener方法注册和addActionListener以接收事件 8】设计一个计算器,其中要使用按钮、文本框、布局管理和标签等构件,能实现加、减、乘、除运算[ 解答] :Text4_8.javaimport java.awt.*;import java.awt.event.*;public class Test4_8 extends Frame implements ActionListener{TextField txlFl 1 ,txtF12,txtF13;Button btn 1 ,btn2,btn3,btn4,btn5;public Test4_8(){super( " 简单的四则运算器)setSize(300,400);setVisible(true);setLayout(new GridLayout(3,l));txtFll=new TextField(5);txtF12=new TextField(5);txtF13=new TextField(5);btnl=new Button("+ ");btn2=new Button("- ");btn3=new Button("*u);btn4=new Button(uH -n);Panel pl=new Panel();p 1 .add(txtFl 1 );p 1 .add(txtF12);p 1 .add(newLabel(n=M));p 1 .add(txtF13);Panel p2=new Panel();p2.add(btnl);p2.add(btn2);p2.add(btn3);p2.add(bln4);add(new Label。 请在下面输入运算数并运算规则进行运算: ”));add(pl);add(p2);addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent we){System.exit(O);}});validate();btn 1 .addActionListener(this);btn2.addActionListener(this);btn3.addActionListener(this);btn4.addActionListener(this);)public void actionPerformed(ActionEvent e){float num 1 =Float.valueOf(txtFl 1 .getText()).floatValue();float num2=Float.valueOf(txtF12.getText()).floatValue();//两种字符串转整形的方法float rs=0;if (e.getSource()==btnl){rs=numl+ num2;txtF13.setText(String.valueOf(rs));)else if (e.getSource()==btn2) {rs=numl- num2;txtF13.setText(String.valueOf(rs));)else if (e.getSource()==btn3) {rs=numl*num2;txtF13.setText(String.valueOf(rs));)else if (e.getSource()==btn4) {rs=numl/num2;txtF13.setText(String.valueOf(rs));public static void main(String[] args){new Test4_8();))[9 ]创建一个窗体,窗体中有一个按钮,当单击按钮后,就会弹出一个新窗体。 [ 解答] : Test4_9.javaimport java.awt.*;import java.awt.event.*;public class Test4_9 extends Frame implements ActionListener{Button bin;public Test4_9(){super( " 弹出窗口练 习 )setS ize(300,200);setVisible(true);setLayout(new BorderLayout());btn=new Button( ” 点击我会弹出窗口” ) ;Panel pl=new Panel();pl.add(new Label— ));pl.add(btn);pl.add(new Label(n *'));add(nSouthn,pl);validate();addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent e){System.exit(O);}I ) ;btn.addActionListener(this);)public void actionPerformed(ActionEvent e){new Test4_9();)public static void main(String[] args){new Test4_9();))[1 0 ]编写图形界面的Application程序,该程序包含一个菜单,选择这个菜单的“ 退出”选项可以关闭Application的窗口并结束程序。 [ 解答] : Test4_10.javaimport java.awt.*;import java.awt.event.*;public class Test4_10 extends Frame {MenuBar mbar;Menu file,edit,help;Menuitem file_open,file_new,file_exit;Menuitem edit_copy,edit_cut;Menuitem help_about;public Test4_ 10()(super( " 菜单Application 程 序 )setS ize(400,300);setVisible(true);mbar=new MenuBar();setMenuBar(mbar);file=new Menu( ” 文件" ) ;edit=new Menu( " 编辑 )help=new Menu( " 帮助" ) ;mbar.add(file);mbar.add(edit);mbar.add(help);file_new=new Menuitem( " 新建” ) ;file_open=new Menuitem( " 打开” ) ;file_exit=new Menuitem( " 退出)file.add(file_new);file.add(file_open);file.addSeparator();file.add(file_exit);edit_copy=new Menuitem( " 复制” ) ;edit_cut=new Menuitem( “ 粘贴” ) ;edit.add(edit_copy);edit.add(edit_cut);help_about=new Menuitem( " 关于 )help.add(help_about);validate();)public static void main(String[] args){new Test4_10();))[111什么是容器的布局?试列举并简述Java中常用的几种布局策略。 [ 解答] : AW T容器分为两类:外部容器和内部容器其中,外部容器一般会独立存在,例如Frame类;而内部容器则会嵌套在外部容器内部使用,例如Panel类容器的布局是指对添加的各个组件进行有序的、统一的对位置进行编排,使其更加美观1 . 顺序布局顺序布局( Flow Layout)是最基本的一种布局,面板的默认布局就是顺序布局顺序布局指的是把图形元件一个接一个地放在面板上下面是一个顺序布局的例子package sample;import java.awt.*;import java.awt.event. Window Adapter;import java.awt.event.WindowEvent;public class MyFlowLayout {private Frame f;private Button button 1, button2, button3;public static void main (String args[]) {MyFlowLayout mflow = new MyFlowLayout ();mllow.go();)public void go() {f = new Frame ("FlowLayout 演 示 )f.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent evt) {f.setVisible(false);f.dispose();System.exit(O);)) ) ;//f.setLayout(new FlowLayout());f.setLayout(new FlowLayout(FlowLayout.LEADING, 20, 20));button 1 = new Button( “ 确定” ) ;button2 = new Bulton( " 打开)button3 = new Button( " 关闭” ) ;f.add(buttonl);f.add(button2);f.add(butlon3);f.setSize (200,200);f.pack();f.setVisible(true);))程序运行结果见图。 2 . 边界布局边界布局( BorderLayout)包括5 个区:北区、南区、东区、西区和中区这5 个区在面板上的分布规律是“ 上北下南,左西右东下面是一个边界布局的例子package sample;import java.awt.*;import java.awt.event. Window Adapter;import java.awt.event.WindowEvent;public class MyBorderLayout {Frame f;Button east, south, west, north, center;public static void main(String args[]) {MyBorderLayout mb = new MyBorderLayout();mb.go();)public void go() {f = new Frame(nBorderLayout 演 示 )f.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent evt) {f.setVisible(false);f.dispose();System.exit(O);)) ) ;f.setBounds(0, 0, 300, 300);f.setLayout(new BorderLayoutO);north = new Button,北 )south = new Button( “ 南” ) ;east = new Button( “ 东” ) ;west = new Button( " 西" ) ;center = new Button( “ 中“ ) ;f.add(BorderLayout.NORTH, north);f.add(BorderLayout.SOUTH, south);f.add(BorderLayout.EAST, east);f.add(BorderLayout.WEST, west);f.add(BorderLayout.CENTER, center);f.setVisible(true);1)程序运行结果见图。 3 . 网格布局网格布局( Grid Layout)把面板分成一个个大小相等的网格, 你可以给出网格的行数和列数下面是一个网格布局的例子package sample;import java.awt.*;import java.awt.event.*;public class MyGridLayout {private Frame f;private Button[] btn;public static void main(String args[]) {MyGridLayout grid = new MyGridLayout();grid.go();)public void go() {f = new Frame(nGridLayout 演示” ) ;f.addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent evt) {f.setVisible(false);f.dispose();System.exit(O);)1 ) ;f.setLayout (new GridLayout (3, 3, 10, 10));btn = new Button[9];for(int i = 0; i <=8; i+ + ) {intj = i + l;btn[i] = new Button(,H, + j);f.add(btn[i]);)// f.pack();f.setSize(100, 100);f.setVisible(true);))程序运行结果见图。 4 . 卡片布局卡片布局(Card Layout)把每个组件看作一张卡片,好像一副扑克牌,它们叠在一起,每次只有最外面的一个组件可以被看到package sample;import java.awt.*;import java.awt.event.*;public class MyCardLayout {public static void main(String args[]) {new MyCardLayout().go();)public void go() {final Frame f = new Frame(nCardLayout 演 示 )f.addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent evt) {f.setVisible(false);f.dispose();System.exit(O);)} ) ;f.setSize(3OO, 100);f.setLayout(new CardLayout());final Frame fl = f;for(int i = 1 ; i <= 5; + + i) {Button b = new ButtonC*Button " + i);b.setSize(100, 25);b.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent ae) {CardLayout cl = (CardLayout)fl .getLayout();cl.next(fl);)} ) ;f.add(b, "button" + i);)f.setVisible(true);)程序运行结果见图。 单击按钮Button 1 后,显示下一个按钮Button2,依此类推5 . 网格包布局网 格 包 ( GridBag)布局是基于网格布局之上的一种改进和基本的网格布局不同的是,一个组件可以跨越一个或多个网格,这样一来增加了布局的灵活性为了处理网格的跨越性,我们可以使用GridBagConstraints类有兴趣的读者可以参考Java A PI来了解它package sample;import java.awt.*;import java.util.*;import java.awt.event.*;public class MyGridBagLayout extends Panel {protected void makebutton(String name,GridBagLayout gridbag,GridBagConstraints c) {Button button = new Button(name);gridbag.setConstraints(button, c);add(button);)public void go() {GridBagLayout gridbag = new GridBagLayout();GridBagConstraints c = new GridBagConstraints();setFont(new Font("Helvetica", Font.PLAIN, 14));setLayout(gridbag);c.fill = GridBagConstraints.BOTH;c.weightx = 1.0;makebutton("Button001", gridbag, c);makebutton(nButton2", gridbag, c);makebutton("Button3,'» gridbag, c);c.gridwidth = GridBagConstraints.REMAINDER; //end rowmakebutlon("Button4n, gridbag, c);c.weightx = 0.0; //reset to the defaultmakebutton(nButton5", gridbag, c); //another rowc.gridwidth = 2; //GridBagConstraints.RELATIVE; //next- to- last in rowmakebutton(MButton6", gridbag, c);c.gridwidth = GridBagConstraints.REMAINDER; //end rowmakebutton("Button007", gridbag, c);c.gridwidth = 1; //reset to the defaultc.gridheight = 2;c.weighty = 1.0;makebutton(,'Button8',» gridbag, c);c.weighty = 1.0; //reset to the defaultc.gridwidth = GridBagConstraints.REMAINDER; //end rowc.gridheight = 1; //reset to the defaultmakebutton("Button9n, gridbag, c);makebutton(HButton 10", gridbag, c);setSize(300, 100);)public static void main(String args[ ] ) {final Frame f = new Frame(nGridBagLayout 演示” ) ;f.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent evt) {f.setVisible(false);f.dispose();System.exit(O);)} ) ;MyGridBagLayout gb = new MyGridBagLayout();gb.go();f.add("Center", gb);f.pack();f.setVisible(true);))程序运行结果见图。 12]根据本章所学的内容编程:设计一个模拟的文字编辑器,并用菜单实现退出的功能[ 解答] :Test4_12.javaimport java.awt.*;import java.awt.event.*;public class Test4_12 extends Frame implements ActionListener{MenuBar mbar;Menu file,edit,help;Menuitem file_open,file_new,file_save,file_exit;Menuitem edit_copy,edit_cut,edit_pase,edit_del;Menuitem help_about;Button btn_copy,btn_pase,btn_cut,btn_del;TextArea txtAr;boolean ifdo;StringBuffer strtmp;public Test4_12(){super( " 菜单Application 程序" ) ;setSize(400,300);setVisible(true);setLayout(new BorderLayoutO);mbar=new MenuBar();setMenuBar(mbar);stamp=new StringBuffer();file=new Menu( " 文件)edit=new Menu( " 编辑 )help=new Menu( " 帮助)mbar.add(file);mbar.add(edit);mbar.add(help);file_new=new Menuitem( “ 新建” ) ;file_open=new Menuitem( " 打开 )file_open.setEnabled(false);file_save=new Menuitem( “ 保存" ) ;file_save.setEnabled(false);file_exit=new Menuhem( " 退出 )file.add(file_new);file.add(file_open);file.add(file_save);file.addSeparator();file.add(file_exit);edit_copy=new Menuitem( " 复制” ,new MenuShortcut(KeyEvent.VK_C));edit_pase=new Menullem( " 粘贝占'new MenuShortcut(KeyEvent.VK_V));edit_cut=new Menuitem( " 剪切” ,new MenuShortcut(KeyEvent.VK_X));edit_del=new Menuitem( " 删除” ,new MenuShortcut(KeyEvent.VK_DELETE));edit.add(edit_copy);edit.add(edit_pase);edit.add(edit_cut);edit.add(edit_del);heip_about=new Menuitem( " 关于" ) ;help.add(help_about);txtAr=new TextArea(8,10);Panel pl=new Panel();btn_copy=new Button( “ 复制” ) ;btn_cut=new Button( " 剪切" ) ;btn_pase=new Button( " 粘贝占)btn_del=new Button( " 删除)pl.setLayout(new FlowLayout(FlowLayout.LEFT));pl .add(btn_copy);pl .add(btn_cut);pl .add(btn_pase);pl .add(btn_del);add(uNorthH,pl);add(”Cenler”,txtAr);validate();file_new.addAcdonListener(this);file_open.addActionListener(this);file_save.addActionListener(this);file_exit.addActionListener(this);edit_copy.addActionListener(this);edit_pase.addActionListener(this);edit_cut.addActionListener(this);edit_del.addActionListener(this);help_about.addActionListener(this);btn_copy.addActionListener(this);btn_cut.addActionListener(this);btn_pase.addActionListener(this);btn_del.addActionListener(this);addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvenl we){System.exit(O);}});)public void actionPerformed(ActionEvent e){if (e.getSource()==file_new) {txtAr.setText(null);)else if (e.getSource()==file_open) {)else if (e.getSource()==file_save) {)else if (e.getSource()==file_exit){System.exit(O); //退出)else if (e.getSource()==edit_copy| | e.getSource()==btn_copy){ 〃复制的实现strtmp.delete(O,strtmp.length());strtmp.append(txtAr.getSelectedText());)else if (e.getSource()==edit_pase| | e.getSource()==btn_pase){ 〃粘贴的实现txtAr.insert(strtmp.toString()4xtAr.getSelectionEnd());else if (e.getSource()==edit_cut| | e.getSource()==btn_cut){ 〃剪切的实现strtmp.delete(O,strtmp.length());strtmp.append(txtAr.getSelectedText());String strtmp 1 =new String(txtAr.getText().substring(0,txtAr.getSelectionStart()));String strtmp2=newString(txtAr.getText().substring(txtAr.getSelectionEnd(),txtAr.getText().length())); // 0 一个新 的 String,它包含此序列当前所包含的字符子序列。 txtAr.setText(strtmp 1 + strtmp2);)else if(e.getSource()==edit_del| | e.getSource()==btn_del){String strtmpl=new String(txtAr.getText().substring(0,txtAr.gelSelectionStart()));String strtmp2=newString(txtAr.getTexl().substring(txtAr.getSelectionEnd(),txtAr.getText().lengdi()));〃 返回一个新 的 String,它包含此序列当前所包含的字符子序列txtAr.setText(strtmpl4- strtmp2);)1public static void main(String[] args){new Test4_12();))【 13】创建一个输入对话框,从对话框中输入文字,当按下“ 确定”按钮后,能在屏幕上显示输入的文字[ 解答] : Test4_13.javaimport java.awt.*;import java.awt.event.*;class Test4_13 extends Frame implements ActionListener{TextArea txtAr;Button btnl;public Test4_13(){super( " 对话框练习)setS ize(300,400);setVisible(true);setLayout(new BorderLayout());btnl=new Button( " 打开对话框,, ) ;txtAr=new TextArea(8,10);add("North",btnl);add( "Center”,txt Ar);validate();addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvenl we){System.exit(O);} } ) ;btn 1 .add ActionListener(this);public void actionPerformed(ActionEvent e){DiaObj dia=new DiaObj(this,txtAr); 〃声明和实例话对话框, 传递frame,和Ixtar 参数)public static void main(String[] args) {new Test4_13();))class DiaObj implements ActionListener {Frame fr=new Frame();TextArea txtAr2=new TexlArea(8,10);TextField txtFl=new TextField(20);Button btnSend=new Button( " 发送文字)Dialog dia;〃初始化DiaObj,并定义参数fr,txtAr2public DiaObj(Frame fr,Text Area txtAr2){this.txt Ar2=txtAr2;this.fr=fr;dia=new Dialog(fr,”传递消息对话框, 二true);dia.setSize(200,100);dia.setLayout(new FlowLayoutO);dia.add(txtFl);dia.add(btnSend);btnSend.addActionListener(this);dia.addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent we){dia.selVisible(false); 〃退出对话框} } ) ;dia.validate();dia.setVisible(true);)public void actionPerformed(ActionEvent e){txtAr2.append(txtFl.getText()4-,,\ nn);txtFl.setText("");〃 清空内容第5 章 Ja v a s w i n g 基础【 1】应 用 swing组件,改 写 【 例44 】的密码验证程序。 [ 解答] :import javax.swing.*;import java.awt.*;import java.awt.event.*;public class XitiDaan5_l extends JFrame implements ActionListener{JLabeljl;JTextFieldjt2;JPanel jp;TextField tl;JButton jb;XitiDaan5_l(){super( " 密码验证” ) ;setSize(800,600);setVisible(true);Container con=getContentPane();con.setLayout(new BorderLayout());jp=new JPanel();jl=new JLabel("请输入密码:” ) ;tl=new TextField(25);11. setEchoCharC*');jt2=new JTextField(25);jb=new JButton( “ 确定” ) ;jp.adcKjl);jp.add(tl);jp.add(jb);jp.add(jt2);con.add(jp,BorderLayout.CENTER);jb.addActionListener(this);validate();)public void actionPerformed(ActionEvent e){if(t 1 .getText().equals(,'abcH))jt2.setText( " 密码正确! ! ” ) ;elsejt2.setText( " 密码错误 !! " ) ;)public static void main(String[] args){new XitiDaan5_l();程序运行结果如图。 密码总证请给人密尾:P *1 1密码正嘀? ? -i【2】将通讯录显示到一个表格中[ 解答] :/ / 将通讯录显示到表格import javax.swing.*;import java.awt.*;import java.awt.event.*;class Tongxunlu_Table extends JFrame(public Tongxunlu_Table()(super( " 班级通讯录" ) ;String[] columnNames = { " 姓名" , " 性别" , " 班级” , " 固定" , " " , " 地址” } ;Object[][] data = {( " 张三" , " 男","040703”, "0595- 22082642","13959941987","泉州" } ,{ " 李四" , " 男","040703","0595- 22082643”, "13959941237",“南安” } ,「王 五 男 " ,"040703","0595- 22082645”, "13959941987","泉州" } ,{ " 张 也 女","040703","0595- 22082649”,"13959574487","福州" } ,( " 李名" , " 男",”040703","0595- 22082644”,"13955421187","泉州" } ,{ " 张涛" , " 男","040703","0595- 22082647"," 13959998887","厦门" } ,{ " 章萍" , " 女","040703","0595- 22082640”,"13959941887","泉州" } ,{ " 谢少福" , " 男丫'040703","0595- 22082643","13959941987","漳州" } ,「黄志强" , " 男","040703”,"0595- 22082641","13955647887”,"泉州,, } ,{ " 张 志 晨 男 " ,"040703","0595- 22082646","13988441987”,"龙岩,' } ,{ " 张明美" , " 女","040703","0595- 22082638","13959988198","莆田" }) ;JTable table = new JTable(data,columnNames);table.setPreferredScrollableViewportSize(new Dimension(500,70));JScrollPane scrollPane = new JScrollPane(table);getContentPane().add(scrollPane, BorderLayout.CENTER);addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {System.exit(O);));pack();setSize(800,600);setVisible(true);))〃主类public class Xitidaan5_2(public static void main(String[ | args)(Tongxunlu_Table frame = new Tongxunlu_Table();))程序运行结果如图所示\ 班级通讯录一回姓名性别班级固定地址张 三男0407030595-2208264213959941987泉州至 四男0407030595-2208264313959941237南安王 五男0407030595-2208264513959941987泉州*也女0407030595-2208264913959574487福州车名男0407030595-2208264413955421187泉州张 涛男0407030595-2208264713959998887豆口* 洋女0407030595-2208264013959941887泉州倒少福男0407030595-2208264313959941987漳州K志强S0407030595-2208264113955647887泉州男0407030595-2208264613988441987玲欠明典1 *0407030595-2208263813959988198雷由[ 3]改 进 【 例5- 11】,编写一个能动态改变树结点的程序。 [ 解答] :/ * ” 利用TreeNode构造动态树” * /import javax.swing.*;import javax.swing.tree.*;import java.awt.*;import java.awt.event.*;import java.awt.GridLayout;import java.awt.Toolkit;import javax.swing JLabel;import javax.swing. JPanel;import javax.swing. JRadioButton;import javax.swing.JScrollPane;import javax.swing.JTree;import javax.swing.tree.DelaultMutableTreeNode;import javax.swing.tree.DefaultTreeModel;import javax.swing.tree.MutableTreeNode;import j a vax. s w i ng. tree .T reePath;import javax.swing.tree.TreeSelectionModel;import javax.swing.event.TreeModelEvent;import javax.swing.event.TreeModelListener;class TreeNodeChild extends DefaultMutableTreeNode{JPanel Parent;JRadioButton PartRadio ;JLabel PartLabel ;public TreeNodeChild(String Node){Parent = new JPanel();PartRadio = new JRadioButton();PartLabel = new JLabel();PartLabel.setT ext(Node);Parent.add(PartRadio);Parent.add(PartLabel);1)class DynamicTree extends JPanel {TreeNodeChild rootNode;DefaultTreeModel treeModel;JTree tree;Toolkit toolkit = Toolkit.getDefaultToolkit();DynamicTree(){super(new GridLayout(l,0));TreeNodeChild rootNode = new TreeNodeChild(nRoot Node'*);treeModel = new DefaultTreeModel(rootNode);treeModel.addTreeModelListener(new MyTreeModelListener());tree = new JTree(treeModel);tree.setEditable(true);tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);tree.setShowsRootHandles(true);JScrollPane scrollPane = new JScrollPane(tree);add(scrollPane);)public void removeCurrentNode() {TreePath currentselection = tree.getSelectionPath();if(currentSelection != null){DefaultMutableTreeNodecurrentNode=(DefaultMutableTreeNode)(currentSelection.getLastPathComponent());MutableTreeNode parent=(MutableTreeNode)(cun*entNode.getParent());if(parent!=null){treeModel.removeNodeFromParent(currentNode);return;toolkit.beepO;public TreeNodeChild addObject(Object child) {TreeNodeChild parentNode = null;TreePath parentPath = tree.getSelectionPath();if(parentPath==null){parentNode=rootNode;}else{parentNode = (TreeNodeChild)(parentPath.getLastPathComponent());)return addObject(parentNode, child, true);)public TreeNodeChild addObject(TreeNodeChild parent, Object child) {return addObject(parent, child, false);1public TreeNodeChild addObject(TreeNodeChild parent,Object child, booleanshouldBeVisible){TreeNodeChild childNode = new TreeNodeChild(child.toStringO);if(parent==null){parent = rootNode;)treeModel.insertNodeInto(childNode, parent, parent.getChildCount());if(shouldBeVisible){tree.scrollPathToVisible(new TreePath(childNode.getPath()));)return childNode;})class MyTreeModelListener implements TreeModelListener {public void treeNodesChanged(TreeModelEvent e) {DefaultMutableTreeNode node;node = (DefaultMutableTreeNode)(e.getTreePath().getLastPathComponent());try{int index = e.getChildIndices()[O];node = (DefaultMutableTreeNode)(node.getChildAt(index));}catch(NullPointerException exc) {)System.out.println(HThe user has finished editing the node.");System.out.println("New value: " + node.getUserObjectO);)public void treeNodesInserted(TreeModelEvent e) {)public void treeNodesRemoved(TreeModelEvent e) {}public void treeStructureChanged(TreeModelEvent e) { }public class XitiDaan5_3 extends JFrame implements ActionListener)JButton jbl,jb2;JPanel jp2;// JPanel jpl;int newNodeSuffix =1;String ADD_COMMAND二 " 添 力 口 ” ;String REMOVE_COMMAND二 “ 移除” ;DynamicTree treePanel;XitiDaan5_3(String s){super(s);treePanel= new DynamicTree();// popu 1 ateT ree( treePane 1 );jbl=new JButton( " 添力 CT );jb2=new JButton( " 移除 )//jpl=new JPanel();jp2=new JPanel();Container con=getContentPane();con.setLayout(new BorderLayout());/* DefaultMutableTreeNode root=new DefaullMutableTreeNode("c:\ \ ");〃树的根节点。 DefaultMutableTreeNode tl=new DefaultMutableTreeNode( " 备份资料) 〃节点DefaultMutableTreeNode t2=new DefaultMutableTreeNode(nJava 学 习 ) 〃节点DefaultMutableTreeNode tl_l=new DefaultMutableTreeNode( " 思维论坛精华帖子)DefaultMutableTreeNode tl_2=new DefaullMulableTreeNode( " 来往邮 件 )DefaultMutableTreeNode t2_l=new DefaultMutableTreeNode( " 视频教程)DefaultMutableTreeNode t2_2=new DefaullMutableTreeNode("Java3Dn);root.add(t 1 );root.add(t2);1 1 .add(t 1 _ 1);t 1 .add(t 1 _2);//t 1 _ 1 ,t 1 _2 成为U 的子节点t2.add(t2_l);t2.add(t2_2);//t2_l,t2_2 成为t2 的子节点。 JTree tree =new JTree(root); 〃创建根为root 的树JScrollPane scrollpane=new JScrollPane(tree);jpl .add(scrollpane);*/jp2.add(jb I);jp2.add(jb2);treePanel.setPreferredSize(new Dimension(300, 150));con.add(treePanel,BorderLayout.CENTER);// con.add(jp 1 ,BorderLayout.NORTH);con.add(jp2,BorderLayout.SOUTH);setSize(800,600);setVisible(true);validate();jbl.setActionCommand( " 添加 )jbl .addAclionListener(lhis);jb2.setActionCommand( " 移除)jb2.addActionListener(this);addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent e){System.exit(O);)});public void actionPerformed(ActionEvent e){String command = e.getActionCommand();if (ADD_COMM AND.equals(command)) {treePanel.addObject(uNew Node " + newNodeSuffix+ + );Jelse if(REMOVE_COMMAND.equals(command)) {treePanel.removeCurrentNode();))public static void main(String[| args){new XitiDaan5_3("利用TreeNode 构造动态 树 )))程序运行结果如图所示。 添加 移除第六章J a v a图形与图像处理[1 1 用绘制线段的方法输出一个红色的“ 王”字[ 解答] : 代码如下:import javax.swing.*;import java.awt.*;public class Draw Wang extends JFrame {public DrawWang(){super( " 在窗体上绘制一个王字))public void paint(Graphics g){g.setColor(Color.red);g.drawLine(l 0,50,100,50);g.drawLine( 10,100,100,100);g.drawLine( 10,150,100,150);g.drawLine(60,50,60,150);)public static void main(String[] args) {Draw Wang dw = new DrawWangO;dw.setSize( 150,200);dw.setVisible(true);))运行效果如下:[2 ]编写一个程序绘制8 个同心圆,各园相差2 0 个像素点[ 解答] : 代码如下:import javax.swing.*;import java.awt.*;public class EightCircle extends JFrame {public EightCircle(){super( " 在窗体上绘制八个同心圆))public void paint(Graphics g){g.setColor(Color.red);g.draw0val(200,200,1 0,10);g.drawOvaK 180,180,50,50);g.drawOval(l 60,160,90,90);g.drawOval(l 40 J 40,130,130);g.drawOval( 120,120,170,170);g.drawOval(l 00 J 00,21 0,210);g.draw0val(80,80,250,250);g.draw0val(60,60,290,290);)public static void main(String[] args) {EightCircle ec = new EightCircle();ec.setSize(500,400);ec.setVisible(true);)运行效果如下:在白体上绘JM八个同心网区I同图[3 ]编写一个程序绘制一把打开的折扇。 [ 解答] : 代码如下:import javax.swing.*;import java.awt.*;public class T5 extends JFrame )public T5(){super( " 打开的折扇" ) ;)public void paint(Graphics g){g.setColor(Color.red);g.fill Arc(50,50,300,300,15,150);g.setColor(Color.BLUE);g.fiIlArc(l 40,140,120,120,15,150);g.setColor(Color.BLACK);g.fillArcd 80,180,40,40,15,150);)public static void main(String[] args) {T5 ec = new T5();ec.setSize(500,400);ec.setVisible(true);1)运行效果如下:[ 4]改变一副彩色照片的颜色,使之成为黑白照片,[ 解答] : 代码如下:import javax.swing.*;import java.awt.*;import java.awt.image.PixelGrabber;import java.awt.image.ColorModel;import java.awt.image.ImageProducer;import java.awt.image.MemorylmageSource;public class ConvertToBlack extends JFrame{private Image imgOriginal,imgChanged;private int[] pixels;public ConvertToBlack(){//load original imageimgOriginal = new ImagelconC'src/images/swingo.jpg'^.getlmageO;int height = imgOriginal.getHeight(this);int width = imgOriginal.getWidth(this);pixels = new int[width * height];System.out.println(height);//grabber pixels from image to ArrayPixelGrabber grabber = new PixelGrabber(imgOriginal,0,0,width,height,pixels,0,width);try (grabber.grabPixels();} catch (InterruptedException e) {e.printStackTraceO;)//change the pixelsColorModel model = ColorModel.getRGBdefault();for (int i = 0; i < pixels.length; i+ + ) {int pixel = pixels。 ];int alpha = model.getAlpha(pixel);int gray = (int)(model.getRed(pixel) * 0.3+ model.getGreen(pixel) * 0.59+ model.getBlue(pixel) * 0.11);int red = gray;int green = gray;int blue = gray;pixels[i] = (alpha « 24) | (red « 16) | (green « 8) | blue;)//create new imageImageProducer producer = new MemoryImageSource(width,height,pixels,0,width);imgChanged = createlmage(producer);setSize(3OO,3OO);setVisible(true);)public static void main(String[] args) {new ConvertToBlackQ;public void paint(Graphics g){g.drawlmage(img0riginal,20,20,this);g.drawImage(imgChanged, 140,20,this);)运行效果如下(5 1 编写一段产生三维文字的程序。 [ 解答] : 请先安装Java 3D 类库,代码如下:import com.sun.j3d.utils.universe.SimpleUniverse;import com.sun.j3d.utils.universe.ViewingPlatform;import com.sun.j3d.utils.behaviors.vp.OrbitBehavior;import javax.media.j3d.*;import javax.vecmath.Point3f;import javax.vecmath.Point3d;import javax.vecmath.Color3f;import javax.vecmath.Vector3f;import java.awt.*;public class Text3DC {private String fontName = "default";private String textString = null;private SimpleUniverse u;private OrbitBehavior orbit;public BranchGroup createSceneGraph(){float si = textString.length();BranchGroup objRoot = new BranchGroupO;TransformGroup objScale = new TransfbrmGroup();Transfbrm3D t3d = new Transform3D();/ / 设置字体大小t3d.setScale(1.5/sl);objScale.setTransform(t3d);objRoot.addChild(objScale);TransformGroup objTrans = new TransformGroupO;objScale.addChild(objTrans);〃建立3D 字Font3D f3d = new Font3D(new Font(fontName, Font.PLAIN, 2),new FontExtrusion());Text3D txt = new Text3D(f3d,textString,new Point3f(- sl/2.0f, - l.f, - 1.0);Shape3D sh = new Shape3D();Appearance app = new Appearance();Material mm = new Material();mm.setLightingEnable(true);app.setMaterial(mm);sh.setGeometry(txt);sh.setAppearance(app);objTrans.addChild(sh);〃设置场景的范围BoundingSphere bounds=new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);〃使物体旋转if (false) {Transform3D yAxis = new Transfbrm3D();Alpha rotationAlpha = new Alpha(- 1, Alpha.INCREASING_ENABLE,0, 0, 4000, 0, 0, 0, 0, 0);Rotationinterpolator rotator =new Rotationlnterpolator(rotationAlpha, objTrans, yAxis,0.0f, (float) Math.PI*2.0f);rotator.setSchedulingBounds(bounds);objTrans.addChild(rotator);)/ / 设置背景Color3f bgColor = new Color3f(0.15f, 0.15f, 0.5f);Background bgNode = new Background(bgColor);bgNode.setApplicationBounds(bounds);objRoot.addChild(bgNode);/ / 设置环境光源Color3f ambientColor = new Color3f(0.9f, 0.9f, 0.90;AmbientLight ambientLightNode = new AmbientLight(ambientColor);ambientLightNode.sellnfluencingBounds(bounds);objRoot.addChild(ambientLightNode);/ / 设置光源方向Color3f light 1 Color = new Color3f( 1 .Of, l.Of, 0.9f);Vector3f light 1 Direction = new Vector3f(1.0f, l.Of, l.Of);Color3f light2Color = new Color3f( 1 .Of, l.Of, 0.9f);Vector3f light2Direction = new Vector3f(- l.Of, - l.Of, - l.Of);DirectionalLight light 1= new DirectionalLight(lightl Color, light 1 Direction);light 1 .setlnfluencingBounds(bounds);objRoot.addChild(lightl);DirectionalLight light2= new DirectionalLight(light2Color, light2Direction);light2.setInfluencingBounds(bounds);objRoot.addChild(light2);return objRoot;)public Text3DC(){textString = "Java3DH;BranchGroup scene = createSceneGraph();u = new SimpleUniverse();〃在虚拟空间中添加鼠标行为ViewingPlatform viewingPlatform = u.getViewingPlatform();viewingPlatform.setNominalViewingTransformO;/ / 设置鼠标控制orbit = new OrbitBehavior();BoundingSphere bounds =new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);orbit.setSchedulingBounds(bounds);viewingPlatform.setViewPlatformBehavior(orbit);u.addBranchGraph(scene);)public static void main(String[] args) {new Text3DC();))运行效果如下* ⑥同因第7章多线程与异常处理[1] java为什么要引入线程机制,线程,程序和进程之间的关系是怎样的?[ 解答] : Java之所以引入线程机制是因为:线程间的通信非常简单且有效,上下文切换非常快,它们是同一个进程中的两部分之进行的切换,每个线程彼此独立执行,一个程序可以同时使用多个线程来完成不同的任务。 简而言之, 一个程序至少有一个进程, 一个进程至少有一个线程. 线程的划分尺度小于进程, 使得多线程程序的并发性高另外, 进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率线程在执行过程中与进程还是有区别的每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制从逻辑角度来看,多线程的意义在于一个应用程序中, 有多个执行部分可以同时执行 但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配这就是进程和线程的重要区别进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动, 进程是系统进行资源分配和调度的一个独立单位 线程是进程的一个实体, 是CPU调度和分派的基本单位, 它是比进程更小的能独立运行的基本单位. 线程自己基本上不拥有系统资源, 只拥有一点在运行中必不可少的资源( 如程序计数器, 一组寄存器和栈) , 但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源. 一个线程可以创建和撤销另一个线程; 同一个进程中的多个线程之间可以并发执行。 进程和线程的主要差别在于它们是不同的操作系统资源管理方式进程有独立的地址空间,一个进程崩溃后, 在保护模式下不会对其它进程产生影响, 而线程只是一个进程中的不同执行路径线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些[ 2]线程有哪几种基本状态,试描述它们之间的转换图[ 解答] :1)新建: 当一个Thread类或者其子类的对象被声明并创建时,新的线程对象处于新建状态,此时它已经有了相应的内存空间和其他资源2 ) 就绪: 处于新建状态的线程被启动后,将进入线程队列排队等待CUP服务,这个时候具备了运行的条件, 一旦轮到CPU的时候, 就可以脱离创建它的主线程独立开始自己的生命周期3 )运行: 就绪的线程被调度并获得CU P的处理边进入了运行状态,每一个Thread类及其子不能处于死亡状态的线程不具有继续执行的能力,线程死亡主要的原因是正常运行的线[ 3] Runnable接口有哪些抽象的方法? Thread类有哪些主要域和方法类的对象都有一个重要的run()方法, 当线程对象被调度执行的时候, 它将自动调用本对象的run()方法,从第一句代码开始执行.所以说对线程的操作应该写到run()方法中。 4 ) 阻塞: 一个正在执行的线程如果再某种情况下不能执行了. 进入阻塞状态, 这个时候它进入排队状态, 只有引起了阻塞的原因消失的时候, 线程才可以继续进入排队状态等待CUP处理5 )死亡:程完成了全部工作,即执行完了run()方法,另外就是被提前强制的终止了[ 解答] :Runnable接口就一个抽象的方法run()private char name[];private int priority;名字优先级public final static int MIN_PRIORITY=1;public final static int MAX_PRIORITY=10;等主要的方法有:public static native Thread currenlThread()最小优先级定义最大小优先级定义返回当前线程public static native void yield 停当前线程,让出其它的线程可以得以执行public static native void sleep(long millis) 线程休眠一段时间public synchronized void start() 开始线程public void run()线程的主要运行方法public final void suspend()线程挂起private native void resume()线程挂起以后恢复执行41创建线程有几种方式?为什么有时候必须采用其中种方式,试写出使用这种方式创建线程的一般模式。 [ 解答] : 有两种方式,一种是实现Runnable接口,一种是继承Thread类因为java不能支持多继承,所以有的时候一个类如果已经继承了别的类,那他就不能用Thread类来继承这种方式来创建一下线程,所以就只能实现Runnable接口这种方式创建线程的一般模式是:( 1)实现Runnable 接口 2 ) 复写run方法 3 ) 新建线程对象的时候以这个对象的实例做为参数值 4 ) 调用线程类的start 方法来启动线程51举例说明线程同步的概念[ 解答] : 线程的同步问题主要是因为多个线程要同时使用某个临介资源的时候来造成数据的不正确产生的如果把资源做成一个对象的话, 这时为了正确的使用这个资源,在一个线程使用此对象的时候, 此对象的其它的线程就不应该能访问这个资源, 或以一个安全的方式来访问这就是java的线程同步要解决的主要问题举例说明:在使用数据库的时候,如果一个用户正在对一条记录进行修改,而另一个用户也要对这条记录时行修改,这样就形成线程同步的问题[6 ]程的方法编写两个10* 10矩阵的相乘的计算程序,用10个线程完成结果矩阵每一行的计算/ * * 两个10*10的矩阵相乘的程序*/public class TenThread {〃定义三个1 0 1 10*10的矩阵,C 是用来存放结果的int[][]a = new int[10][10];int[][] b = new int[10][10];int[][]c = new int[10][10];//内部的线程类,用来实现矩阵的行列相乘class MultiThread extends Thread )int i = 0;〃传入的参数表示行数public MultiThread(int i){this.i = i;)public void run() {for (int kl = 0; kl < 10; kl++) {for (int k = 0; k < 10; k+ + ){c[i][kl] = c[i][kl] + a[i][k] * b[k][kl];)))public TenThread() {〃赋值的数据int count = 0;/ / 把矩阵赋值for (inti = 0;i<10; i+ + ) {for (int j = 0; j < 10; j+ + ){a[i][j] = count;b[i][j] = count+ + ;)))public static void main(String[] args) {TenThread tt = new TenThread();for (int i = 0; i < 10; i+ + ) {tt.new MultiThread(i).start();)/ / 等待所有线程的执行完成try{Thread.sleep(l 000);}catch(Exception e){e.printStackTrace();)/ / 打印for(int i=0 ;i<10;i+ + ){for(int j=0;j<10;j+ + ){System.out.print(tt.c[i] [j]+"");)System .out.println("\ n");)})[7 编写一个龟兔赛跑的多线程程序,单击按键以后龟兔开始赛跑。 [ 解答] :import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.applet.*;public class Race extends JApplet implements Runnable {int xl, x2, yl, y2;〃速度intdl = 10, d2 = 5;Thread a=null;Thread b=null;public void init() {Container cp=getContentPane();xl = 10;x2= 10;yl =50;y2= 100;)public void start() {a = new Thread (this);b= new Thread(this);a.start();b.start();}public void run() {while (true) {if(Thread. currentThread()==a) {xl + = dl;if(xl==200){dl=0;}}else{x2 + = d2;)if(xl > 300| | x2>300) {System.exit(O);a.stopO;b.stopO;)repaint();try {a.sleep(lOO);| catch (InteiTuptedException e){)public void paint(Graphics g) {g.setColor(Color.gray);g.fillRect(O, 0,400, 200);g.setColor(Color.red);g.drawLine(310, 0,310,150);g.setColor(Color.red);g.fillOval(xl,yl, 10, 10);g.setColor(Color.green);g.fillOval(x2, y2, 10, 10);g.drawString( " 红球是兔子,绿球是乌龟!* * , 50, 180);HTML代码 两个对应类实现的功能相同,只是在操作时的导向不同[ 3]说明输入流,输出流的概念及作用如何实现输入和输出流类的读写方法的传递[ 解答] : 就流的运行方向来说,流分为输入流和输出流,输入流将外部数据引入计算机输出流是交数据引导到外部设备输入输出流读写方法的传递一般可以以一个字节缓冲数组做为中间的桥梁[ 4]解释字节流,字符流,字节文件输入流和字符文件输出流的含义[ 解答] : 字 节 流 :以二进制数据这最基本的数据表示方式的流字符流:按 每 16位的Unicode码来处理字符数据的流字节文件输入流: 字节文件输入流是从字节输入流中继承而来的, 它用于处理二进制的文件输入操作字符文件输出流: 字符文件输出流是从字符输出流中继承而来的, 它用于处理字符为操作单位的文件数据的输出[ 5]简述File类在文件管理中的作用与使用方法[ 解答] : 作 用 :提供了描述文件和目录的操作与管理的方法,它不负责数据的输入,输出专门用来管理磁盘文件与目录使用方法:( 1 ) 创建File类的对象 2 ) 以gelName 等方法来判断或获取文件或目录信息 3 ) 对文件及目录进行操作[6 ]计算Fibonacii数列,a 1=1 ,a2= 1...an=an- 1 +an- 2即前两个数是1,从3 个数开始,每个数是前两个数的和,计算数列的前2 0 项,并用字节文件流的方式输出到一个文件,要求每5项1 行。 [ 解答] :import java.io.File;import java.io.FileOutputStream;/***计算Fibonacii数列的前2 0 项*/public class Fibonacii {〃数列的长度int i = 0;int[] f = null;public Fibonacii(int i) {this.i = i;)/***得到数列的函数* @return int[]*/public int[] getFibonacii() {if(i<2){return new int[] { 1, 1 };} else {f = new int[i];〃给数列赋初值fl0] = l;f[l] = 1 ;for (int k = 2; k < i; k+ + ) {f[k] = f[k- l] + f[k- 2];)return f;(}/***保存入文件* @param name*/public void saveToFile(String name) {try (File file = new File(name);FileOutputStream fo = new FileOutputStream(file);〃换行int 1 = *\ n';for (int i = 0; i < 20; i+ + ) {〃每5 个一行if(i !=0&&i% 5==0) {fo.write(l);)fo.write(f[i]);)} catch (Exception e) {e.printS tackT race();))//test and displaypublic static void main(String[] args) {int[] fb20 = null;Fibonacii fb = new Fibonacii(20);fb20 = fb.getFibonacii();/ / 打印for (int i = 0; i < 20; i+ + ) {System.oul.println(fb20[i]);)fb.saveToFile("D:\ \ a.dat");))[7 ]利用文件输入/ 输出流类编程实现一个信函文件的显示与复制[ 解答] :import j a va. io. B offered Reader;import java.io.BufferedWriter;import java.io.File;import java.io.FileReader;import java.io.FileWriter;/*** 文件的显示和复制*/public class FileDisplayAndCopy {/ / 复制的文件File fileCopy;〃读取的文件名String filename=Hn;〃用来存放数据的SlringBuffer;StringBuffer sb=new StringBuffer('H');* @param fileCopy拷贝的文件* @param filename 源文件* /public FileDisplayAndCopy(String fileCopy,String filename))this.filename=filename;this.fileCopy=new File(fileCopy);)/ * **读出内容并显示* /public void display(){try (FileReader fr=new FileReader(filename);BufferedReader br=new BufferedReader(fr);〃读数据String str;while((str=br.readLine())! =null) {sb.append(str);sb.append(,\ n,);)} catch (Exception e) {e.printStackTraceO;)〃显示System.out.println(sb.toStringO);)public void copy() {try (FileWriter fw=new FileWriter(fileCopy);BufferedWriter bw=new BufferedWriter(fw);/ / 写数据流bw.write(sb.toSlring(),0,sb.toString().length());bw.flush();) catch (Exception e) {e.printS tackT race();))//testpublic static void main(String[] args){FileDisplayAndCopy fda=new FileDisplayAndCopy(,'d:\ \ a.txtM,,,d:\ \ b.txtn);fda.displayO;fda.copyO;[ 8]建立一个文本文件,输入一段短文,编写一个程序,统计文件中字符的个数,并将结果写入另一个文件[ 解答] :import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileReader;import java.io.FileWriter;/***统计文件中字符的个数,并将结果写入另一个文件*/public class FileCharCounter {〃源文件和目的文件File fileDec;String src;StringBuffer sb = new StringBuffer('H');public FileCharCounter(String dec, String src) {this.fileDec = new File(dec);this.src = src;)/***统计数目* @return*/public int count() {try {sb = new StringBuffer('H));FileReader fr = new FileReader(src);Buffered Reader br = new BufferedReader(fr);〃读数据String str;while ((str = br.readLine()) != null) {sb.append(str);)} catch (Exception e) {e.printStackTrace();)return sb.toString().length();)/***写文件*/public void writeTo(){try (FileWriter fw=new FileWriter(fileDec);BufferedWriter bw=new BufferedWriter(fw);〃写数据流String c=String.valueOf(count());bw.write(c);bw.flush();} catch (Exception e) {e.printStackTrace();))//testpublic static void main(String[] args){FileCharCounter fda=new FileCharCounter(ud:\ \ a.txt'V'd:\ \ b.txt");System.out.println(fda.count());fda.writeTo();1)[9 ]建立一个文本文件,输入学生3 门课的成绩,编写一个程序,读入这个文件中的数据,输出每门课的成绩的最小值,最大值和平均值。 [ 解答] :成绩.txt文件id#000001 e#98 m#76 p#76id#000002 e#54 m#74 p#76id#000003 e#98 m#73 p#78id#000004 e#98 m#77 p#76id#000005 e#92 m#45 p#76id#000006 e#94 m#33 p#74id#000007 e#98 m#88 p#76id#000008 e#96 m#34 p#76import java.io.BufferedReader;import java.io.FileReader;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import java.util.StringTokenizer;/***建立一个文本文件, 输入学生3 门课的成绩读入这个文件中的数据, 输出每门课的成绩的最小值,最大值和平均值/class Student {String id;〃英语成绩float e;〃数字成绩float m;〃物理成绩float p;/ * ** @return Returns the e.* /public float getE() {return e;)/ * ** @param e* The e to set.* /public void setE(float e) {this.e = e;)/ * ** @return Returns the id.* /public String getld() {return id;)* @param id* The id to set.* /public void setId(String id) {this.id = id;)/ * ** @return Returns the m.* /public float getM() {return m;)/ * ** @param m* The m to set.* /public void setM(float m) {this.m = m;)* @return Returns the p.*/public float getP() {return p;)/*** @param p* The p to set.*/public void setP(float p) {this.p = p;)}public class CountS {〃文件路径String filepath;//list用来存放学生数据List list = new ArrayList();public CountS(String str) {filepath = str;init();)〃初始化操作,用来读数据和解析数据放入相应的对象中public void init() {try {FileReader fr = new FileReader(filepath);BufferedReader br = new B ufferedReader(fr);〃读数据String str;while ((str = br.readLine()) != null) {Student s = new Student();〃解析数据StringTokenizer st = new StringTokenizer(str.toString(),H n);〃前面是标号,后面是数据String first =String data = ,M,;String elem = st.nextToken();//id的解析first = elem.split(,,#,,)[ O] ;data = elem.split(n#M)[l];s.setld(data);〃英语成绩elem = st.nextToken();first = elem.split(n#")[O];data = elem.split("#n)[l];s.setE(Float.valueOf(data).floatValue());〃数学成绩elem = st.nextToken();first = elem.split(n#,,)[ O] ;data = elem.split(H#H)[l];s.setM(Float.valueOf(data).floatValue());〃物理成绩elem = st.nextToken();first = elem.split(n#")[O];data = eleiYi.split("#")[l];s.setP(Float.valueOf(data).floatValue());〃加入listlist.add(s);)} catch (Exception e) {e.printStackTrace();public void countAnddisplayO{〃 0是最小值,1,最 大 值 2 是平均分float [ ] e=new float口 { 100,0,0};float[] m=new float口 { 100,0,0};float[] p=new float[]{ 100,0,0};for (Iterator it = list.iterator(); it.hasNext();) {Student ele = (Student) it.next();〃英语if(e[0]>ele.getE()) {e[0]=ele.getE();)if(e[l] [ 解答] : 可以将对象作为一个整体通过对象流进行传输和存储 11】编写程序,保存一个文本对象并检索对象的数据[ 解答] :import java.io.File;import java.io.FilelnputStream;import java.io.FileOutputStream;import java.io.ObjectlnputStream;import java.io.ObjectOutputStream;import java.io.Serializable;/***保存一个文本对象并检索对象的数据*/public class Contex implements Serializable {〃其中的两个文本对象String textl =,,M;String text2 = ,M,;* @return Returns the text 1 .*/public String getTextl() {return textl;)/*** @param textl* The textl to set.*/public void setTextl (String textl) {this.textl = textl;)/*** @return Returns the text2.*/public String getText2() {return text2;)/*** @param text2* The text2 to set.*/public void setText2(String text2) {由 is.text2 = text2;)//for testpublic static void main(String[] args) {Contex c = new Contex();c.setTextl(nthis is textl");c.setText2(nthis is test2u);/ / 将对象保存入文件File file = new File(,'d:/temp.dat,');try {FileOutputStream fo = new FileOutputStream(file);ObjectOutputStream oo = new ObjectOutputStream(fb);oo.writeObject(c);} catch (Exception e) {e.printStackTraceO;)〃将对象从文件中取出,并操作其数据Contex d=null;try {FilelnputStream fo = new FilelnputStream(file);ObjectlnputStream oo = new ObjectlnputStream(fo);d=(Contex)oo.readObject();System.out.println(c);System.out.println(d);System.out.println(d.getTextl());System.out.println(d.getText2());} catch (Exception e) {e.printStackTrace();)))[ 12]利用File类的delete。 方法, 编写程序, 删除某一个指定文件[ 解答] :import java.io.File;/ * *, 利用File类的delete 方法,编写程序,删除某一个指定文件 /public class FileDelete {File file=null;public FileDelete(String filename){file=new File(filename);)//delete 方法public void deleteFile(){file.delete();)//testpublic static void main(String[ ] args) {FileDelete f=new FileDelete("d:/temp.dat,^);f.deleteFile();))[ 131改写例8—16使之能打开一个文件对话框,从而播放选取的音频文件[ 解答] :import java.awt.Button;import java.awt.FlowLayout;import java.awt.Frame;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event. Window Adapter;import java.awt.event.WindowEvent;import java.io.BufferedlnputStream;import java.io.File;import java.io.FilelnputStream;import javax.swing. JFileChooser;import sun.audio.AudioPlayer;import sun.audio.AudioStream;class Sound(FilelnputStream file;BufferedlnputStream buf;File filename;public Sound(File filename)(try(file=new FilelnputStream(filename);buf=new BufferedlnputStream(file);AudioStream audio=new AudioStream(buf);AudioPlayer.player.start(audio);1catch (Exception e) {e.printStackTraceO;)))public class Example8_ 16 extends Frame implements ActionListener(File filename;Button btn;Button btn2;Example8_16()(super( "音频播放器” ) ;setBounds(300,300,200J 00);setVisible(true);btn=new Button( "播放") ;btn2=new Button( "选择文件)setLayout(new FlowLayoutO);add(btn);add(btn2);btn.addActionListener(this);btn2.addActionListener(this);validate();addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(O);)});public void actionPerformed(ActionEvent e)if(e.getSource()==btn) {Sound play = new Sound(this.filename);Jelse if(e.getSource()==btn2) {JFileChooser fc = new JFileChooser(new File。 '. ") ) ;if (fc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {filename = fc.getSelectedFile();)))public static void main(String[] args)(new Example8_16();第9章网络通信[ 1 ] java提供了哪几种网络通信模式?[ 解答] : 基 于 TC P/IP协议的面向连接的通信模式,基于UD P协议的面向无连接的通信模式[ 2] java的套接字网络通信方式分为哪几种?[ 解答] :基 于 TCP/IP协议:客户端套接字,服务器端套接字基 于 UD P协议:用户数据报套接字,广播数据报套接字[ 3]什么是socket,怎样建立socket连接?建立连接时,客户端和服务器端有什么不同?[ 解答] :Socket就是套接字,是I P 地址和端口号的组合当两个网络程序需要通信时,它们可以通过使用Socket类建立套接字连接服务器端建立Socket以后,要执行一个等待的方法,以方便客户端来连接客户端建立Socket以后即与服务器端进行连接, 成功握手以后, 双方产生同样的Socket对象。 [ 4]请列举常用的协议及其端口号[ 解答] :ftp 21/tcptelnet 23/tcpsmtp 25/tcphltp 80/tcppop3 110/tcpsnmp 161/udphttps 443/tcphttps 443/udppop3 110/tcp[ 5]试描述用Socket建立连接的基本程序框架[ 解答] :( 1) 客户端建立套接字对象,指定服务器I P 和端口号 2) 服务器端建立套接字,并指定端口号、( 3) 服务器端监听本机的端口的状态:执行accept 4) 客户端程序在对象产生以后以及,服务器端的程序监听到有连接以后都会产生一个Socket类的实例 5) 对这两个实例中对应的输入流和输出流进行操作,即完成通信过程[ 6]说明客户端如何与服务器端进行连接[ 解答] :TCP / I P 的方式是: 客户端产生Sockel对象的同时产生与对应端口号的服务器连接的动作UD P数据报的方式是:客户端建立DatagramSocket对象,建立报文DatagramPacket对象,并指定发送的I P 地址,调用socket对象的send方法进行连接并发送数据[ 7]说明客户端如何从服务器读一行文本。 [ 解答] :TC P/IP的方式是:客户端与服务器端成功握手以后,从Socket中得到数据输入流并用相应的包装器进行包装,以输入流中相应的read方法来读取一行的文本UD P数据报的方式是:建立数据报的DatagramSocket对象以后,调用DatagramSocket对象的receive方法来等待服务器的数据到来,接收到数据以后用DatagramPacket对象的gelData方法来将接收到的数据提取出来[ 8]说明服务器如何将数据发送到客户端[ 解答] :TCP / I P 的方式是:客户端与服务器端成功握手以后,从Socket中得到数据输出流并用相应的包装器进行包装,用并向客户端调用相应的write方法来发送数据UD P数据报的方式是:创建数据报文DatagramSocket对象,调用DatagramSocket对象的receive方法来等待客户端的请求到来从到来的DatagramPacket包中得到地址和端口号,建立数据报文对象,发送数据报[ 9]采用套接字的连接方式编写一个程序,允许客户向服务器提出一个名字,如果这个文件存在,就把文件内容发送给客户,否则回答文件不存在[ 解答] :/ / 客户端import java.awt.Button;import java.awt.FlowLayout;import java.awt.TextField;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event. Window Adapter;import java.awt.event.WindowEvent;import java.io.BufferedlnpulStream;import java.io.DatalnputStream;import java.io.DataOutputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import .Socket;import javax.swing.JFrame;public class TranFileClient extends JFrame implements ActionListener {Button btn;TextField tf;public TranFileClient(){/ / 布局super( ” 要接收的文件 名 )setBounds(400,400,300J 00);setVisible(true);btn=new Button( "接收") ;tf=new TextField(7);setLayout(new FlowLayoutO);add(tf);add(btn);btn.addActionListener(this);validate();addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(O); }});)public static void main(String[] args){new TranFileClient();)/* (non- Javadoc)* @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)*/public void actionPerformed(ActionEvent argO) {try (Socket st = new Socket(',localhost',,3997);〃给服务器文件名DataOutputStream outServ =new DataOutputStream( st.getOutputStream());outServ.writeUTF(tf.getText().trim());/ / 读服务器的消息FileOutputStream out = new FileOutputStream(tf.getText().trim());InputStream netin = st.getInputStream();InputStream in = new DataInputStream(new BufferedlnputStream(netin));System.out.println(ngeting data..…");byte[] buf=new byte[2048];//int num = in.read(buf);while(num != - 1){out.write(buf, 0, num);num = in.read(buf);〃取出服务器的状态String str=new String(buf);if(TranFiIeServer.PROP.equals(str.trim())){tf.setText( "文件没有找到 !))in.close();out.close();outServ.close();System.out.println("recieved over.....”);} catch (lOException e) {e.printS tackT race();)))服务器import .ServerSocket;import .Socket;import java.io.*;public class TranFileServer {〃查找的文件的目录final static String PATH = "d:/src”;final static String PROP = "NO";boolean isExist = false;public TranFileServer() {init();)private void init() {ServerSocket server;Socket st;String s = null;try (server = new ServerSocket(3997);System.out.println("waiting client connect'1);st = server.accept();〃读客户端来的文件名try (DatalnputStream in = new DataInputStream(st.getInpulStream());while (true) {s = in.readUTF();if (s != null)break;System.out.prinlln(s);} catch (lOException e) {System.out.println("ERRO:n + e);throw e;)doCheck(s);if (isExist) {FilelnputStream fos = new FileInputStream(PATH+ '7n+ s);OulputStream netout = st.getOutputStream();DataOutputStream doc = new DataOutputStream(new BufferedOutputStream(netout));System.out.println("sending data....");byte[] buf = new byte[2048];int num = fbs.read(buf);while (num != - 1) {doc.write(buf, 0, num);doc.flush();num = fos.read(buf);)fos.close();doc.close();}else{OulputStream netout = st.getOutputStream();DataOutputStream doc = new DataOutputStream(new BufferedOutputStream(netout));doc.write(PROP.getBytes());doc.close();)} catch (lOException e) {e.printStackTrace();))/*** 文件是否存在判断** @param s* @return*/private void doCheck(String s) {boolean isExist;/ / 文件是否存在File file = new File(PATH);String[] filenames = file.list();for (int i = 0; i < filenames.length; i+ + ) {String str = filenames[i];if (str.equals(s)) {this.isExist = true;return;)))public static void main(String[] args) {new TranFileServer();))[1 0 ]写出使用多线程使得一个服务器同时为多个客户程序服务的基本框架。 [ 解答] :*多客户端一个服务器的例子*/.*;import java.io.*;import java.awt.*;import java.awt.event.*;class C_client extends Frame implements ActionListener {Text Area txtl;Button btn;Panel p;int port;DatalnputStream in = null; 〃数据输入流DataOutputStream out = null; //数据输出流Socket c_socket; 〃套接字InputStream in_data; 〃接收到的输入流OutputStream out_data; 〃发送的输出流String str; 〃存放接收的数据int i = 0;C_client() {super( "客户端)setSize(300, 200);setVisible(true);txtl = new TextArea(5, 4);add(txtl, BorderLayout.CENTER);p = new Panel();add(p, BorderLayout.NORTH);btn = new Button( "连接” ) ;p.add(btn);btn.addActionListener( this);validate();public static void main(String[] args) {new C_client();)public void actionPerformed(ActionEvent eee) {try (c_socket = new Socket(" 127.0.0.1", 4321);} catch (lOException e) {e.printS tackT race();)try {in_data = c_socket.getInputStream();out_data = c_socket.getOutputStream();in = new DatalnputStream(in_data);out = new DataOutputStream(out_data);int pl = c_socket.getPort();int p2 = c_socket.getLocalPort();txtl.append( "获取到对方的端 口号: " + pl + ”\ rT);txtl.append( "本机的端 口 号 : “ + p2 + "\ n");} catch (lOException e) {e.printStackTrace();)try (str = in.readUTF();txtl.append( “ 客户收至ij: ” + str + ”\ n”);if(i> 10) {out.writeUTF(uendn);c_socket.close();System.exit(O);} 〃发出end信息else {out.writeUTFC*1 am Client'*);i+ + ;)} catch (lOException e) {System.out.println(',ddd,');)))/***多客户端一个服务器的例子*/import .*;import java.io.*;import java.awt.*;import java.awt.event.*;class S_server extends Frame implements ActionListener,RunnableServerSocket s_socket; 〃服务器端套接字Socket c_socket; 〃 套接字DatalnputStream in=null; 〃数据输入流DataOutputStream out=null; 〃数据输出流InputSlream in_data; 〃接收到的输入流OutputStream out_data; 〃发送的输出流int i=0; 〃计数( 连接的客户数)String str;TextArea txtl;Button btn;Panel p;S_server()(super(nservern);setSize(300,200);setVisible(true);txtl=new TextArea(5,4);add(txtl ,BorderLayout.CENTER);p=new Panel();add(p,BorderLayout.NORTH);btn二 new Button( "开始监听端口 ” ) ;p.add(btn);validate();btn.addActionListener( this);)public void actionPerformed(ActionEvent eee)(try(s_socket=new ServerSocket(4321);while(true)(c_socket=s_socket.accept();Thread t=new Thread(this);t.start();i + + ;}}calch(IOException e){ })/ / 线程public void run()(try (while(true)in_data=c_socket.getInputStream();out_data=c_socket.getOutputStream();in=new DataInputStream(in_data);out=new DataOutputStream(out_data);out.wrileUTF("HeHo,我是服务器)str=in.readUTF();if (str.equals(,,endn)){ / / 接收到end信息,则断开连接in.close();out.close();c_socket.close();)txll.append( “ 第”+ i+ ”个客户发来:” + str+ ”\ n");Thread.sleep(200);} //while_end)catch(IOException e){e.printS tackT race();)catch(Exception ee){ee.printStackTrace();} //Thread_catch)public static void main(String[] args)(new S_server();})[1 1 ]写出一个客户同时有多个服务器为他提供服务的基本框架。 [ 解答] :/*** 一个客户端多个服务器的例子*/.*;import java.io.*;import java.awt.*;import java.awt.event.*;class C_clientl extends Frame implements ActionListener, Runnable {TextArea txtl;Button btn;Panel p;int port;DatalnputStream in = null; 〃数据输入流DataOutputStream out = null; 〃数据输出流/ / 套接字InputStream in_data; 〃接收到的输入流Outputstream out_data; 〃发送的输出流String str; //存放接收的数据String[] IP = new String口 { ”127.0.0・ 17'127.0.0・ 2”, Q27.0.0.3” }; 〃 服务器的IPint IPi = 0; //IP 的下标C_clientl() {super( "客户端)setSize(300, 200);setVisible(true);txtl = new TextArea(5,4);add(txtl, BorderLayout.CENTER);p = new Panel();add(p, BorderLayout.NORTH);btn = new Button( "连接” ) ;p.add(btn);btn.addActionListener( this);validate();)public static void main(String[| args) {new C_clientl();)public void actionPerformed(ActionEvent eee) {Thread tl = new Thread(this);tl.start();Thread t2 = new Thread(this);tl.start();Thread t3 = new Thread(this);tl.start();)public void run() {Socket c_socket = null;try {c_socket = new Socket(IPfIPi+ + ], 4321);} catch (lOException e) {e. pr i n tS tackTrace();)try (in_data = c_socket.getInputStream();out_data = c_socket.getOutputStream();in = new DataInputStream(in_data);out = new DataOutputStream(out_data);String pl = c_socket.getInetAddress().getHostAddress();int p2 = c_socket.getLocalPort();txtl.append( "获取到对方的 IP: ” + pl + n\ n");txtl.append( "本机的端 口 号 : " + p2 + "\ nn);str = in.readUTF();txtl.append( "客户收到:” + str + M\ nH);out.writeUTF(nI am Client");} catch (lOException e) {e.printS tackT race();)))/*** 一个客户端多个服务器的例子*/.*;import java.io.*;import java.awt.*;import java.awt.event.*;class S_serverl extends Frame implements ActionListener{ServerSocket s_socket; 〃服务器端套接字Socket c_socket; 〃套接字DatalnputStream in = null; 〃数据输入流DataOutputStream out = null; 〃数据输出流InputSlream in_data; 〃接收到的输入流OutputStream out_data; 〃发送的输出流int i = 0; 〃计数( 连接的客户数)String str;TextArea txtl;Button btn;Panel p;S_serverl() {super("servern);setSize(300, 200);setVisible(true);txtl = new TextArea(5,4);add(txtl, BorderLayout.CENTER);p = new Panel();add(p, BorderLayoul.NORTH);btn = new Button( "开始监听端口)p.add(btn);validate();btn.addActionListener( this);public void actionPerformed(ActionEvent eee) {s_socket = new ServerSocket(4321);c_socket = s_socket.accept();in_data = c_socket.getInputStream();out_data = c_socket.getOutputStream();in = new DataInputStream(in_data);out = new DataOutputStream(out_data);out.writeUTF(”Helk) ,我是服务器)str = in.readUTF();in.close();out.close();c_socket.close();} catch (lOException e) {)//Thread_catch1public static void main(String[] args) {new S_server();第1 0章Ja va数据库连接[ 1] 试述JDBC提供了哪几种连接数据库的方法。 [ 解答] :JDBC连接数据库的方法取决于JDBC驱动程序类型,Java定义了4 种JDBC驱动程序类型:(l)JDBC- ODBC桥驱动程序JDBC- ODBC桥接器负责将JDBC转换为O D BC,用JdbcOdbc.Class和一个用于访问ODBC驱动程序的本地库实现的这类驱动程序必须在服务器端安装好ODBC驱动程序,然后通过JDBC- ODBC的调用方法,进而通过ODBC来存取数据库2) Java 到本地API这种类型的驱动程序是部分使用Java语言编写和部分使用本机代码编写的驱动程序,这类驱动程序也必须在服务器端安装好特定的驱动程序,如ODBC驱动程序,然后通过桥接器的转换,把Java A PI调用转换成特定驱动程序的调用方法,进而操作数据库3)网络协议搭配的Java驱动程序这种驱动程序将JDBC转换为与DBM S无关的网络协议,这种协议又被某个服务器转换为一种DBM S协议这种网络服务器中间件能够将它的纯Java客户机连接到多种不同的数据库上所用的具体协议取决于提供者 4 ) 本地协议纯Java驱动程序这种类型的驱动程序将JDBC访问请求直接转换为特定数据库系统协议 不但无须在使用者计算机上安装任何额外的驱动程序, 也不需要在服务器端安装任何中间程序, 所有对数据库的操作,都直接由驱动程序来完成。 [ 2] SQ L语言包括哪几种基本语句来完成数据库的基本操作[ 解答] :SQ L语言包括以下6 种基本语句来完成数据库的基本操作:(l)select语句:用来对数据库进行查询并返回符合用户查询标准的结果数据(2)create table语句:用来建立新的数据表3)insert语句:向数据表中插入或添加新的数据行4)update语句:更新或修改符合规定条件的记录5)delete语句:删除数据表中的行或记录6)drop table语句:删除某个数据表以及该表中的所有记录[ 3] Statement接口的作用是什么?[ 解答] : Statement接口用于执行静态SQ L语句并返回它所生成结果的对象 在默认情况下,同一时间每个S tatem ent对象在只能打开一个R esu ltS et对象因此,如果读取一个R esu ltS et对象与读取另一个交叉,则这两个对象必须是由不同的S tatem ent对象生成的如果存在某个语句的打开的当前R esu ltS et对象,则S tatem ent接口中的所有执行方法都会隐式关闭它[ 4] ExecuteQuery ()的作用是什么?[ 解答] :ExecuteQuery。 方法执行给定的SQ L语句,返回单个R esu ltS et对象发送给数据 库 的 SQ L语句,通常为静态SQL SELECT语句,返回包含给定查询所生成数据的R esultSet 对象[ 5] 试述DriverManager对象建立数据库连接所用的几种不同的方法[ 解答] :DriverManager对象建立数据库连接的方法有以下几种:(1) static Connection getConnection(String u rl):使用指定的数据库URL创建一个连接2) static Connection getConnection(String url, Properties info):使用指定的数据库URL和相关信息( 用户名、用户密码等属性列表) 来创建一个连接,使DriverManager从注册的JDBC驱动程序中选择一个适当的驱动程序1) static Connection getConnection(String url, String user,String password):使用指定的数据库URL、用户名和用户密码创建一个连接,使DriverManager从注册的JDBC驱动程序中选择一个适当的驱动程序。 ⑵ static Driver getDriver(String url):定位在给定URL 下的驱动程序,让DriverManager从注册的JDBC驱动程序中选择一个适当的驱动程序[ 6] 编写一个应用程序,实现可以从一个数据库的某个表中查询一个列的所有信息[ 解答] : 〃英汉词典的应用示例,程序代码如下:import java.sql.*;public class GetColumnAllData)public static void main(String args[ ] ){String cname,ename;Connection Con=null;Statement Stmt=null;try {Class.forName(Hsun.jdbc.odbc. JdbcOdbcDrivern);}catch(ClassNotFoundException e){)try(Con=DriverManager.getConnection(,'jdbc:odbc:test,,/gxy',,"ookkM);Stmt=Con.createStatement();ResultSet rs=Stmt.executeQuery(nSELECT * FROM cidian n);System.out.println( " 表中单词列的所有信息为:" ) ;while (rs.next()){ename=rs.getString( " 单词) cname二 rs.getString("解 释 )System.out.println(ename);Con.close();catch(SQLException ee) {}))[ 7]编写一英汉字典程序,具有查询、添加、修改、删除等功能。 [ 解答] : 程 序代码如下:import java.awt.*;import java.sql.*;import java.awt.event.*;import javax.swing.*;class Data Window extends Frame implements ActionListener{ TextField待查英文单词_ 文本条, 汉语解释. 文本条,更新英文单词_ 文本条, 更新汉语解释一文本条,填加英文单词_ 文本条, 填加汉语解释一文本条,删除英文单词_ 文本条, 删除汉语解释一文本条;Button查询按钮, 更新按钮, 填加按钮, 删除按钮, 清空按钮;in t查询记录=0;Connection Con=null;Statement Stmt=null;DataWindow()( super( "英汉小词典)setBounds( 150,150,300/50);setVisible(true);setLayout(new GridLayout(4,l));try {Class.forName(,'sun.jdbc.odbc.JdbcOdbcDriver,');}catch(ClassNotFoundException e){}try{Con=DriverManager.getConnection("jdbc:odbc:test,,,',gxy',,uookk");Stmt=Con.createStatement();)catch(SQLException ee) {}待查英文单词_ 文本条=new TextField(16);汉语解释一文本条=new TextField(16);更新英文单词.文本条二new TextField(16);更新汉语解释_ 文本条= new TextField(16);填加英文单词_ 文本条= new TextField(16);填加汉语解释_ 文本条=new TextField(16);删除英文单词_ 文本条=new TextField(16);删除汉语解释一文本条二new TextField(16);查询按钮= new Button。 查询” ) ;更新按钮= 1 整¥ Button( "更新” ) ;填加按钮二new Button( "填 力 口 ” ) ;删除按钮二优\ ¥ Button( "删除)清空按钮=new Bimon( "清空文本框” );Panel pl=new Panel , p2=new Panel(),p3=new Panel , p4=new Panel();pl.add(new Label 输入要查询的英语单词: "));pl.add(待查英文单词一文本条);pl.add(new Label 显示该单词的汉语解释: "));pl.add( 汉语解释— 文本条);pl.add( 查询按钮);p3.add(new Label 输入要添加的英语单词: "));p3.add(填加英文单词一文本条);p3.add(new Label,输入该单词的汉语解释: "));p3.add( 填加汉语解释.文本条);p3.add( 填加按钮);p2.add(new Label,输入要更新的英语单词: "));p2.add(更新英文单词.文本条);p2.add(new Label( "输入该单词更新的汉语解释: "));p2.add( 更新汉语解释.文本条);p2.add( 更新按钮);p4.add(new Label。 输入要删除的英语单词: "));p4.add( 删除英文单词_ 文本条);p4.add( 删除按钮);p4.add(new Label(n"));p4.add( 清空按钮);add(p 1 );add(p3);add(p2);add(p4);查询按钮.addActionListener(this);更新按钮.addAclionListener(this);填加按钮.addActionListener(this);删除按钮.add ActionListener(this);清空按钮.addActionListener(this);addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent e){setVisible(false);System.exit(O); ) });)public void actionPerformed(ActionEvent e){if(e.getSource()==查询按钮){ 查询记录二0;try{查询( );}catch(SQLException ee) {})else if(e.getSource()==更新按钮){ try{更新0; }catch(SQLException ee) {})else if(e.gelSource()==填加按钮){try{填加( );}catch(SQLException ee) {})else if(e.getSource()==删除按钮){try{删除( );}catch(SQLException ee) {}else if(e.getSource()==清空按钮){待查英文单词_ 文本条.setText("");汉语解释一文本条.setText。 ");填加英文单词_ 文本条.setText("");填加汉语解释_ 文本条.setText");更新英文单词_ 文本条.setText("");更新汉语解释_ 文本条setTextO;删除英文单词_ 文本条.setText("");))public void 查询0 throws SQLException{ String cname,ename;Con=DriverManager.getConnection(',jdbc:odbc:test,\,,gxy'V,ookk");ResultSet rs=Stmt.executeQuery(nSELECT * FROM cidian n);while (rs.next()){ ename=rs.getString( "单词 ” ); cname=rs.getString( "解释 )if(ename.equals(待查英文单词_ 文本条.getText().trim()))(汉语解释_ 文本条.setText(cname);查询记录=1; break; })Con.close();if( 查询记录==0){ 汉语解释一文本条.setText( "没有该单 词 ) })public void 更新( )throws SQLException( String sl=i + 更新英文单词_ 文本条.getText()本m ()+,s2="”, +更新汉语解释 _ 文本条.getText().trim()+ ,””;String temp=uUPDATE cidian SET 解 释 ="+ s2+ ” WHERE 单 词 =u+sl ;Con=DriverManager.getConnection("jdbc:odbc:test","gxy","ookk");Stmt.executeUpdate(temp); Con.close();JOptionPane.showMessageDialog(thisJ更新成功!、 ) ;1public void 填加( )throws SQLException{ String sl=…+ 填加英文单词_ 文本条.getText().trim()+ …,s2=""+ 填加汉语解释 _ 文本条.getText().trim()+ ", ”;String temp="INSERT INTO cidian VALUES ("+sl+”J+s2+")”;Con=DriverManager.getConnection("jdbc:odbc:test',,,'gxy",',ookkn);Stmt.executeUpdate(temp);Con.close();JOptionPane.showMessageDialog(this,“填 力「 成功!");)public void 删除0 throws SQLException{ String + 删除英文单词_ 文本条.getText().trim()+ ”";String temp=uDELETE FROM cidian WHERE 单 词 ="+sl ;Con=DriverManager.getConnection("jdbc:odbc:test"Jgxy","ookk");Stmt.executeUpdate(temp); Con.close();JOptionPane.showMessageDialog(thisJ册 lj除成功!");))public class Database{ public static void main(String args[]){DataWindow window=new DataWindow();window.pack();))第1 1章常见数据结构及算法分析【 1】设有一数列:ai=3, a2=8, ......., an=2an- i+ 2an- 2,使用堆栈结构输出an的若干项。 [ 解答 ] : 代码如下,运行程序时需要输入一个参数,指出想要输出数列的前多少项import java.util.Stack;public class StackShow {public static void main(String[l args) {Stack st = new Stack();int count = Integer. valueOf(args[0]).intValue();int temp;Integer first = new Integer(3);Integer second = new Integer(8);st.add(first);st.add(second);for (int i = 0; i < count - 2; i+ + ) {temp = first.intValue() + second.intValue();st.add(new Integer(temp));first = second;second = new Integer(temp);)System.out.println( "输出这个系列的前" + count + "个数:” );Object result[] = st.toArrayO;int wanghang = 0;for (int i = result.length - 1 ; i >= 0 ; i-) {System.out.print(st.pop() + M ");wanghang+ + ;if(wanghang % 5 == 0){System.out.prinUn("\ rT);))))输入13时的运行结果如下:C : \ j d k 5 \ b i n \ j a v a - D i d e a . l a u n c h e r , p o r t = 7 5 3购出这个系列的前1 3个 数:8 7 7 5 4 2 3 3 5 2 0 77 9 4 9 3 0 1 9J 3P r o c e s s f i n i s h e d w i t h e xi t c o d e 0[ 2]编写一程序,用哈希表实现学生成绩单的存储与查询。 [ 解答] :学生类Student,代码如下:class Student(private String no;private String name;private Integer score;public String getNo() {return no;)public void setNo(String no) {this.no = no;)public String getName() {return name;)public void setName(String name) {this.name = name;)public Integer getScore() {return score;)public void setScore(Integer score) {this.score = score;1public String toString(){return "学号:" + no + " 姓名:"+ name + ” 成绩:" + score;))主类HashTest,代码如下:import javax.swing.*;import java.util. Vector;import java.util.Hashtable;import java.awt.*;import java.awt.event.ActionListener;import java.awt.event.ActionEvent;public class HashTest extends JFrame {JLabel iblsearchbyidorname;JTextField txfidorname;JButton btnsearchbyidorname;JTable reader;JButton btnadd;JButton btndelete;Hashtable ht;Vector colnames;JLabel iblno;JLabel Iblname;JLabel Ibiscore;JTextField addno;JTextField addname;JTextField addscore;Vector data;public HashTest() throws HeadlessException {super( "学生 成 绩 管 理 )ht = new Hashtable();Iblsearchbyidorname = new JLabel(“学号:txfidorname = new JTextField(20);Iblno = new JLabel("学号");Iblname = new JLabel。 姓 名 )Ibiscore = new JLabel("分 数 )addno = new JTextField(lO);addname = new JTextField(12);addscore = new JTextField(W);btnsearchbyidorname = new JButton( “ 查找・・> ” );btnadd = new JButton( "新 增 )btndelete = new JButton( "删除” );colnames = new Vector();colnames.add( “ 学号” );colnames.add( “ 姓 名” )colnames.add( “ 成绩");data = new Vector();reader = new JTable(new ReaderTableModel(data,colnames));reader. setPreferredS ize(new Dimension(700,260));J Panel pnlsearch = new JPanel();pnlsearch.add(lblsearchbyidorname);pnlsearch.add(txfidorname);pnlsearch.add(btnsearchbyidomame);pnlsearch.add(btndelete);JScrollPane scptable = new JScrollPane(reader,ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);J Panel pnladd = new JPanel();pnladd.add(lblno);pnladd.add(addno);pnladd.add(lblname);pnladd.add(addname);pnladd.add(lblscore);pnladd.add(addscore);pnladd.add(btnadd);reader.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);ScoreHandler sh = new ScoreHandler();btnadd.addActionListener(sh);btndelete.addActionListener(sh);btnsearchbyidorname.addActionListener(sh);Container c = getContentPane();c.add(pnlsearch,BorderLayout.NORTH);c.add(scptable,BorderLayout.CENTER);c.add(pnladd,BorderLayout.SOUTH);setS ize(600,400);setVisible(true);)public static void main(String[| args) {new HashTest();)class ScoreHandler implements ActionListener{public void actionPerformed(ActionEvent e) {JButton bln = (JButton)e.getSource();if(btn == btnsearchby idorname) {Object obj = ht.get(txfidorname.getText().trim());if(obj == null){JOptionPane.showMessageDialog(nun,” 没有找至ij! * * );}else{JOptionPane.showMessageDialog(null,”查询结果如下:\ n" + obj.toStringO);)}else if(btn == btnadd){Student stu = new Student();stu.setName(addname.getText().trim());stu.setNo(addno.getText().trim());stu.setScore(Integer.valueOf(addscore.getText().trim()));ht.put(stu.getNo(),stu);addDataToTable(stu);addname.setText(uu);addno.setText(n");addscore.setText(,H,);(else if(btn == btndelete){int index = reader.getSelectedRow();if (index == - 1){JOptionPane.showMessageDialog(null,”你没有选择学生! ");}else)String no = (String)reader.getValueAt(index,O);Student stu = (Student)ht.remove(no);JOptionPane.showMessageDialog(nullJ学生成绩册lj除 ! \ n" + stu.toStringO);data.remove(index);reader.repaint();))})public void addDataToTable(Student stu){Vector temp = new Vector();temp.add(stu.getNo());temp.add(stu.getName());temp.add(stu.getScore());data.add(temp);reader.repaint();))运行效果如下:查找:【 3】 ( 走迷宫)下列由符号# 和点组成的图形代表一个迷宫,用一个双下标数组存放。 其中,甘代表迷宫的墙,点代表路径,只有数组中含有点的地方才能走[ 解答] : 对于用如下二维数组表示的迷宫{{1,1,0,1,1,1,1,1),(1,0,0,1,0,0,0,1),(1,1,0,0,0,1,1,1),(1,0,0,1,0,0,0,1),{1,1,1,1,0,1,1,1},(1,0,0,0,0,0,03),{1,0,1,0,1,0,0,1},(1,1,1,0,1,1,1,1))为了简化算法,假设入口是( 0, 2 ) , 出 口 是 ( 7, 3 ) , 程序如下:类 Position用来描述点在数组中的位置和该点旁边四个点是否可以通过的状态, 程序如下:class Position(private int px;private int py;private boolean forwardFlag;private boolean backFlag;private boolean leftFlag;private boolean rightFlag;public Position(int px,int py,int[][] allData){this.px = px;this.py = py;int row = allData.length;int col = allDatafO].length;int forward = px + 1 ;int back = px - 1 ;int left = py + 1;int right = py - 1 ;if(forward == row | | allData[fbrward][py] == 1){forwardFlag = false;)else{forwardFlag = true;)if(back == - 1 | | allData[back]| py] == 1){backFlag = false;}else{backFlag = true;)if(left == col| | allData[px][left] == 1){leftFlag = false;}else)leftFlag = true;}if(right == - 1 | | allData[px][right] == 1){rightFlag = false;}else{rightFlag = true;))public boolean isForwardFlagO {return forwardFlag;)public void setForwardFlag(boolean forwardFlag) {this.forwardFlag = forwardFlag;)public boolean isBackFlagO {return backFlag;)public void selBackFlag(boolean backFlag) {this.backFlag = backFlag;)public boolean isLeftFlagO {return leftFlag;)public void setLeftFlag(boolean leftFlag) {this.leftFlag = leftFlag;)public boolean isRightFlagO {return rightFlag;)public void setRightFlag(boolean rightFlag) {this.rightFlag = rightFlag;)public int getPx() {return px;public void setPx(int px) {this.px = px;)public int getPy() {return py;)public void selPy(int py) {this.py = py;)public String toString(){return "(“ + px + + py + ”)”;))主类:import java.util.Stack;import java.util.Enumeration;import java.util.Iterator;public class PassMaze {int[][] maze = {{1,1,0,1』,1,1,1},{1,0,0,1,0,0,0,11,{1,1,00,0,1,1/},{1,0,0,1,0,0,0,11,{1,1,1,1,0,1,1/},{l,0,0,0,0,0,0,l},{1,0,1,0,1,0,0,1},(1,1,1,0,1,1,1,1));private Stack st, direct;public PassMaze() {direct = new Stack();st = new Stack();Position current = new Position(0,2,maze);st.push(current);while(! isS uccessful(current)) {boolean status = calPassWay(current);if(! status) {st.pop();if(st.empty()){break;)setFlag((Position)st.peek(),(String)direct.pop());)current = (Position)st.peek();if(st.empty()){System.oul.primln( "迷宫没有出路! ”);}else{System.out.printin( "迷宫的出路如下:” ) ;Iterator it = st.iterator();while(it.hasNext()) {System.out.println(it.next().toString());)))private boolean calPassWay(Position pos){boolean result = false;if(pos.isB ackFlag()){Position temp = new Position(pos.getPx() - 1 ,pos.getPy(),maze);temp.setForwardFlag(false);if(contains(temp)) {pos.setBackFlag(false);}else)st.push(temp);direct.push(nBack");result = true;)Jelse if(pos.isForwardFlag()){Position temp = new Position(pos.getPx() + 1 ,pos.getPy(),maze);temp.setBackFlag(false);if(contains(temp)) {pos.setForwardFlag(false);)else{st.push(temp);direct.push("Forwardu);result = true;1Jelse if(pos.isLeftFlagO){Position temp = new Position(pos.getPx(),pos.getPy() + l,maze);temp.setRightFlag(false);if(contains(temp)) {pos.setLeftFlag(false);}else)st.push(temp);direct.push("Leftu);result = true;)}else if(pos.isRightFlagO){Position temp = new Position(pos.getPx(),pos.getPy() - 1 ,maze);temp.setLeftFlag(false);if(contains(temp)) {pos.setRightFlag(false);}else{st.push(temp);direct.push(nRightn);result = true;))return result;)private boolean contains(Position p){boolean result = false;Iterator it = st.iterator();while(it.hasNext()) {Position temp = (Position)it.next();if(p.getPx() == temp.getPx() && p.getPyO == temp.getPy()){result = true;break;))return result;)private void setFlag(Position cuiTent,String dirction){if("Back,'.equals(dirction)){current.setBackFlag(false);}else if(MForward',.equals(dirction)) {currenl.setForwardFlag(false);}else if( nLeftn .equals(dirction)) {current.setLeftFlag(false);}else if(**Right,'.equals(dirction)){current.setRightFlag(false);))private boolean isSuccessful(Position pt){return pt.getPx() == 7 && pt.getPyO == 3;)public static void main(String[] args) {new PassMaze();)第1 2章J2ME程序设计基础[ 11 安装并配置J2M E的运行环境。 [ 解答] : 安装步骤如下:1、安装 JDK1.4;2、安装 J2ME Wireless Toolkit2.2(WTK22);测试运行环境:使 用 W TK创建第一个M IDlet程序,步骤如下:打开开发环境:开始 > 程 序 > J2ME Wireless Toolkit 2.2 > KToolbar,如下:( 2 ) 新建项目项目名称:合法的变量名称就行;M IDlet类名称:该类为程序运行入口类,如下所示:( 3 ) 编写程序使用任意的ID E ,编写类InfoTestjava (M IDlet类名称,与新建项目时的名称相同),同时必须保存在Java源文件目录下如果有图片等资源文件,必须保存在应用程序源文件目录下如下所示:到 J2IE V ir eless T oolkit - Test IDE [T ifH [x |F ile Edit Project Help% Project Qp«n Projectguild Bun弓Goar CoiB«vi c« D«f*ultColorPhon« vCreating project "TestlDE" 人Place Java source files in T \WTK22\apps\TestlDE\src''Place application resource files in MC:\WTK22\apps\TestlDE\res"Place application library files in "C:\WTK22\apps\TestlDE\hb"Settings updatedProject settings saved v« I >源程序如下:import javax.microedition.Icdui.*;import javax.microedition.midlet.*;public class InfoTest extends MIDIet{private Display display;public InfoTest(){display=Display .getDisplay(this);protected void startApp(){Alert alert =new Alert( "信息测试)alert.setTimeout(Alert.FOREVER);String icon="/zsm.jpg”; //从资源目录开始寻找try(Image image=lmage.createlmage(icon);alert.setlmage(image);}catch(java.io.IOException x){ System.out.println( "出错了)}display.setCurrent(alert);)protected void pauseApp(){}protected void destroyApp(boolean unconditional)())( 4 ) 编译与运行[ 2]设计一个公告显示程序。 [ 解答] : 代码如下:import javax.microedition.midlet.MIDlet;import javax.microedition.midlet.MIDletStateChangeException;import javax.microedition.lcdui.Display;import javax.microedition.Icdui.TextBox;import javax.microedition.lcdui.TextField;import javax.microedition.Icdui.Ticker;public class Showinfo extends MIDlet {private Display dp;private TextBox tb;public Showlnfo(){super();tb = new TextBox( "信息公告”,””,200, TextField. ANY);protected void startAppO throws MIDletStateChangeException {dp = Display .getDisplay(this);tb.selTicker(new Ticker( "今天全校停课,哈哈! ” ));tb.setString( "由于天气原因,全校停课一个月,回家种地去!)dp.setCurrent(tb);protected void pauseAppO {)protected void destroyApp(boolean b) throws MIDletStateChangeException {)运行结果如下:[ 3]应用记录管理系统R M S建立一个同学通讯录。 [ 解答] : 同学通讯录的要求如下:1、每个联系人包括两项信息:姓名,号码;2、能对联系人进行增加、删除、修改和查询操作;3、通过一个M IDlet程序实现与用户的交互( 实现界面) 程序如下:TelBean.java:描述联系人实体,既是用于传值的JavaBean,又提供该类对象与字节数组相互转换的方法,代码如下:import java.io.*;public class TelBook {private String name;private String tel;public String getName() {return name;)public void setName(String name)(this.name = name;)public String getTel() {return tel;public void setTel(String tel) {this.tel = tel;public byte[] toByteArray(){byte[] data = null;ByteArrayOutputStream bout = new ByteArrayOutputStream();DataOutputStream dout = new DataOutputStream(bout);try (dout. writeUTF(this.name);dout.writeUTF(this.tel);data = bout.toByteArrayO;dout.close();bout.close();} catch (lOException e) {e.printS tackT race();)return data;)public void initTeIBean(byte[] rec){ByteArraylnputStream bin = new ByteArraylnputStream(rec);DatalnputStream din = new DatalnputStream(bin);try (this.name = din.readUTF();this.tel = din.readUTF。 ;din.close();bin.close();} catch (lOException e) {e.printStackTrace();))}TelModel.java:操作RecordStore,实现对本的增、册 k查、改功能,代码如下:import javax.microedition.rms.RecordStore;import javax.microedition.rms.RecordStoreException;import javax.microedition.rms.RecordStoreNotOpenException;import java.io.*;public class TelModel {private Record Store rs = null;public TelModel() {try (rs = RecordStore.openRecordStoreC'Prer^true);} catch (RecordStoreException e) {e.printStackTrace();))public int addRecord(TelBook mn){int re = - 1;re = rs.addRecord(mn.toByteArray(),0,mn.toByteArray().length);} catch (RecordStoreException e) {e.printStackTrace();return - 1;)return re;)public TelBook getRecord(int recordID){TelBook note = new TelBook();try (byte[] MyNoteBytes = rs.getRecord(recordlD);note.initTelBean(MyNoteBytes);} catch (RecordStoreException e) {e.printStackTrace();1return note;)public boolean setRecord(int recordID,TelBook mn){try (byte[] temp = mn.toByteArray();rs.setRecord(recordID,temp,0,temp.length);} catch (RecordStoreException e) {e.printStackTrace();return false;)return true;)public boolean deleteRecord(int recordID){try (rs.deleteRecord(recordlD);) catch (RecordStoreException e) {e.printStackTrace();return false;)return true;)public int getRecordCounts() {try (return rs.getNumRecords();} catch (RecordStoreNotOpenException e) {e.printS tackT race();return - 1;public void Close(){try (rs.closeRecordStore();} catch (RecordStoreException e) {e.printStackTraceO;)))TelView.java:用户界面,得到用户的输入并显示系统输出,代码如下:import javax.microedition.midlet.MIDlet;import javax.microedition.midlet.MIDletStateChangeException;import javax.microedition.lcdui.*;public class RecordMidlet extends MIDlet implements CommandListener (private Form mForm;private Form note;private Display dp;private TelModel rs;private TextField mSubject,mContent,mID;private int currentID;private int status = - 1;private Command CMD_ADD;private Command CMD_DEL;private Command CMD_EDIT;private Command CMD_EXIT;private Command CMD」NFO;private Command CMD_OK;private Command CMD_CANCEL;public RecordMidlet(){rs = new TelModel();note = new Form("Store Book");mSubject = new TextField( “ 姓名 ”,””,20,0);mContent = new TextField( " 号码"J”,20,0);mID = new TextField( “ 记录号“ J ”,10,TextField.NUMERIC);CMD_ADD = new Command,Add Record",Command.ITEM, 1);CMD_DEL = new Command(nDelete Record'\ Command.ITEM, 1);CMD_EDIT = new Command(uEdit Record",Command.ITEM, 1);CMD_EXIT = new Command(,'Exitn,Command.EXIT, 1);CMD_INFO = new Command(HRecode Store Information",Command.EXIT, 1);CMD_OK = new Command(nOk",Command.OK,l);CMD_CANCEL = new Command(nCancer',Command.CANCEL,l);note.addCommand(CMD_CANCEL);note.addCommand(CMD_OK);note.setCommandListener(this);protected void startAppO throws MIDletStateChangeException {dp = Display.getDisplay(this);if(mForm == null){mForm = new Form( " 本” ) ;mForm.addCommand(CMD_ADD);mForm.addCommand(CMD_DEL);mForm.addCommand(CMD_EDIT);mForm.addCommand(CMD_EXIT);mForm.addCommand(CMD」NFO);mForm.setCommandListener(this);}dp.setCurrent(mForm);)protected void pauseApp() {1protected void destroyApp(boolean b) throws MIDletStateChangeException {rs.Close();)public void commandAction(Command command, Displayable displayable) {if(command == CMD_EXIT){noti fy Destroy ed();Jelse if(command == CMD_CANCEL) {dp.setCurrent(mForm);Jelse if(command == CMD_ADD){note.deleteAll();note.append(mSubject);mSubject.setString("n);note.append(mContent);mContent.setString("");status = 0;dp.setCurrent(note);Jelse if(command == CMD_EDIT){note.deleteAll();note.append(mlD);status = 1;dp.setCurrent(note);(else if(command == CMD_DEL){note.deleteAll();note.append(mlD);status = 3;dp.setCurrent(note);if(command == CMD_OK){Alert a = new Alert。 ");if(status == 0){TelBook my = new TelBook();my.setTel(mContent.getStringO);my.setName(mSubject.getStringO);int id = rs.addRecord(my);a.setString(HAdd record successfully!" + id);a. setTimeout(3000);dp.setCurrent(a,mForm);(else if(status == 1){currentID = Integer.parselnt(mlD.getStringO);TelBook temp = rs.getRecord(cuiTentlD);mSubject.setString(temp.getName());mContent.setString(temp.getTel());note.deleteAll();note.append(mSubject);note.append(mContent);dp.setCurrent(note);status = 2;return;Jelse if(status == 2){TelBook temp = new TelBook();temp.setName(mSubject.getStringO);temp.setTel(mContent.getStringO);boolean re = rs.setRecord(currentID,temp);if(re){a.setString("Edit record successfully");)else{a.setString("Eidt record failure1');)dp.setCurrent(a,mForm);status = - 1;Jelse if(status == 3){currentID = Integer.parselnt(mlD.getStringO);boolean re = rs.deleteRecord(currentlD);if(re){a.setString("Delete record successfully");}else)a.setString(nDelete recode failure1');)dp.setCurrent(a,mForm);)if(command == CMD_INFO){String temp =temp + = "The current RecordStore have" + rs.getRecordCounts() + "records”;Stringitem ss = new StringItem(nRecordStore information\ n",temp);note.deleteAll();note.append(ss);dp.setCurrent(note);status = 4;)))运行结果如下:主界面:新增界面:编辑界面:附录资料:java重点笔记归纳整理Java初级eclipse快捷键:右键一> REFACTER-> RENAME 一改全改ALT+ENTER查看现在项目的位置A lt+ l当前行和下面一行交互位置( 特别实用, 可以省去先剪切, 再粘贴了)Alt+ t当前行和上面一行交互位置( 同上)Ctrl+W关闭当前EditerC + / 注释( 取消注释) 选中行C + S+ /注释多行C+S+\取消注释F 2 查看完整的函数帮助信息, 并且可以复制粘贴文字, 当选中文件时, 有改名作用F3找到变量的定义C+鼠标点击找到变量的定义作用和F3c差不多。 F4找到接口方法的具体实现类.=C+TF5刷新C+F6:在打开的文件间进行切换;C+F7:在资源窗口间进行切换;C+F8:在各种模式间进行切换;C+E:选择某个打开的文件;C+S+r:打开一个文件;c+s+t:打开一个类;c+s+f:格式化代码;C+S+O:导入需要的类c+o:查看类结构;c+t:列出子类或接口实现类( 类的等级结构)Ctrl+Alt+l复制当前行到下一行( 复制增加)Ctrl+Alt+T复制当前行到上一行( 复制增加)Ctrl+ K ( 加 SHIFT是向上) 向下查找选中的字符串 Ctrl + shift+1向上向下查找一个函数和变量Java基础知识l.Java是 Sun公司的JamesGosling发明的面向对象的可跨平台的编程语言2.SUN 公司, Stanford University Network,斯坦福大学;3 平台:我们把cpu处理器与操作系统的整体叫做平台不同的操作系统支持不同的cpu指令集不同的 cup有不同的指令集, 如 intel和 AMD.4 .JDK:Java Software Develop Kit.JVM Java Virtual MachineJava虚拟机, 包 含 : 类加载器, 字节码校验器, java解释器。 JRE:java运行时环境, 包含jvm与java运行支持类库5 . 环境变量:java_home;dasspath:.;C:\Java\jdkL6.0_10\lib;path6 .jdkjd k l.l为jvm增加了 JIT( 即时编译) 编译器;jdkl.2也叫java2 ;jdkl.5也叫java5( 改动较大) ;现在使用的是jdkl.67 .jdk,Java Developent Tool Kit;开发java需要有源程序文件到中间文件的编译器运行java中间文件需要对应平台的解释器( 官方叫法JVM ); 编译器、解释器加上一些其它的组件合称为JDK.JDK的另外一个称呼为JavaSoftware develop kit.JDK 即开发 java 程序的组件jdk=java编译器+jre( java运行环境) jre=jvm+运行支持类库eclipse和jbuilder本身自带了java编译器但不包含jre08 .jre:Java Runtime Environment,java运行时需要的环境有两类, 开发需要的jre和公共jreo9 .jdk版本,jdkl.2 到 jdkl.4 为 java2 时代, java 技术有 j2ee,j2se,jeme.jdkl.5,也叫做 java5,技术术语改为javase,javaee,javame. 1.5 在 1.4 的基础上改动很大。 10 .常用的DOS命令:dir,现实当前文件夹的所有文件; cd . . 打开上级目录; exit: 退出11 .java 注释:java注释分为三种单行注释, 多行注释, 文档注释, 文档注释结果为: / * * 换行* / , 文档注释在帮助文档里面有显示12 .javadoc帮助文档,javadoc可执行程序可生成帮助文档, 用法如下: javadoc TestOl.java13 .java 打包jar,用法见cmd输入jar ;ant也是一种打包成jar的工具, 其功能叫jar更加强大; 除了 jar包外,java文件包还有war,ear两种格式14 .java 缺点:运行速度慢, 占用资源多是java的缺点; 其原因是: class需要二次编译, 解释执行; jvm运行占用资源; 无指针无法直接操作内存, 垃圾回收线程占用资源, 并且不会实时收集内存15JVM,JAVA 虚拟机即java解释器; JVM执行.dass文件需要三步: 类加载器加载; 校验器检查错误, 执行文件在执行的时候有两种方法: a.解释器直接执行; b 5 T 代码生成器搞定16. 两种解释执行方法的区别:直接解释执行是1」版本的, 其直接翻译class文件, 速度必然比机器执行二进制文件的速度慢;1.2版本后引入JTT,即将class文件先转换为二进制文件, 再执行二进制文件, 下次执行时可直接执行二进制文件。 15JIT( 即时编译) :java即时编译技术, 可执行java代码的运行速度17.IDE工具IDE:Integrated Development Environment,集成开发环境18. 开发java的 IDE工具:JCREATOR,JBUILDER,ECLIPSE,NETBEANS.20. 拷贝项目的三种方式:a.拷贝整个工作空间, 切换工作空间 b.拷贝项目, 导入项目 c.只拷贝源代码(即 src文件夹),从新建的项目导入22 . 转义字符:单 引号: \ ' ; 双引号:\";反斜杠: \ \ ; 回车:\n;水平制表符:\t;换 行 :\r.转义字符一般出现在字符串中时, 要是以原型输入, 则输出一定报错, 只有以转换后的才能显示23 . 数据类型转换:byte char short int long float double,String, 小杯到大杯自动转换, 但是大杯至1 1小杯强制转换一般的格式: 标变量=(目标类型) 源变量, 特殊的,String转换为其它,int a =Integer.parselnt(strl);float b = Float.parseFloat(str2);boolean c =Boolean.parseBoolean(str3);24 . 内存分配基本数据类型只在栈中分配内存; 应用数据类型不仅在栈中分配内存, 还在堆中分配内存,在变量声明时, 在栈中分配内存, 当创建对象时, 在堆中分配内存。 25 . 值传递和引用传递本人去见网友叫按引用传递; 替身去见网友叫做按值传递引用传递参数数值改变, 按值传递参数值不变 基本数据类型就是按值传递的, 又称为值类型, 而引用类型是按引用传递的String虽然是按引用传递的, 但是传递给的新变量会有属于自己的堆内存,所 以 ,String值不变包:开发中最好在导入包和类的过程中, 最好是使用哪个类就导入那个类, 不要导入包27 . 包的命名规则:反写的企业域名. 功能名•模块名28 . 系 统 包(SUN提供的包) 默认包-java.lang.常用包java.lang : java的核心类库, 包含了运行java程序必不可少的系统类, 如基本数据类型、基本数学函数、字符串处理、线程、异常处理类等, 系统缺省加载这个包java.lang.reflect: 提供用于反射对象的工具java.io : java语言的标准输入/ 输出类库, 如基本输入/ 输出流、文件输入/ 输出等java.util :常用的工具类, 如集合框架类, 日期处理类等主 题 : 旺旺老师软件工程师实训教程-JAVASE第六章: 包 与JAVA常用类java.sql : JDBC 相关类。 JAVA网络包, 其中包含能够使程序通过网络进行通信的java.awt;javax.swing : 使用java开发C/S结构应用程序使用的类29 . 企业开发中命名规则一般如下:com.easyitedu.dao 〃持久层代码com.easyitedu.view 〃表示层代码com .easyitedu. biz.student //stuent 模块的业务层代码com .easyitedu. biz. teacher //teacer 模块的业务层代码com.easyitedu.tool 〃本项目使用的工具类30 . 包装类:8 个值类型对应的有8 个 类 , 我们把它们称为包装类其作用较八种基本类型的作用强大, java不符合面向对象的两个地方: 一个是JAVA保留了 8 个基本数据类型, 他们不是对象, 更没有属性和方法; 另一个就是JAVA中存在着main方法之所以还在用八种基本类型而不是通通用包装 类 , 是因为一些简单的业务用基本数据类型效率较高, 但是有时必须用八个包装包, 例 如 : 强制类型转换其 中 byte的包装类是Byte.只有char的类是Character,int是 Integer.其它像byte一样是其本身。 说 明 : int a = 10; Integer b = new Integer(lO);其 中 , 前者占用一块内存, 后者占用两块, 符合引用传递自动的拆箱和装箱:把数据由基本数据类型转换为对应包装类叫做装箱, 把数据由包装类转化为基本数据类型叫拆箱实 例 : int a = 10;Integer b = a;〃自动装箱, 基 本 数 据 类 型 包 装 类 intc= b;〃自动拆箱,包装类- > 基本数据类型, 即两种类型可以自动相互转换, 没其它制约.32 .String转换成基本型:调用包装类的 parse***方 法 , 例 如 : String a = "12"; int a = Integer.parselnt(a);33.==和 equals,= = 比较的是堆内存地址, 后者堆内存( 即地址可以不同) .equals,用 法 : 常量.equals( 变量) ,要不然会出现空指针异常34 . 字符串池:当字符串直接赋值时,(string a = "aa";)其堆内存会进入字符串池, 当下次在赋值相同时,Stringb ="aa";b会直接引用a的堆内存但是当赋值为new方法赋值时, 其堆内存不会进入字符串池 , 而是直接开辟一个新的空间。 String c = new String("aa");35 . 三个空字符串的区别:String a = null;String b = " ";String c =其中null,没有分配堆内存空间,b分配了堆内存空间,里面放了一个空格;c虽然分配了内存空间 , 但是没有放东西36 . 字符串拼接:不用String而是用StringBuffer.append(),前者的对内存限定了, 改变后重新分配内存; 后者可以添加内存就像前面是不能加车厢的汽车, 每次都得换车; 后者是可以加车厢的汽车37 . 面向对象编程叫OOP,还有一门知识叫OOAD( 面向对象的分析与设计) , 在OOAD中 , 继承又叫派生, 父类又叫超类38 .@Override 注释:第四种注释, 给java编译器看的, 在编译阶段提示错误, 在重写父类方法时, T 殳加上此注释,表示此方法是重写的父类方法39 .©Deprecated 注释:此方法不推荐使用( 看文档时), T 殳会有功能更强大的方法代替@SuppressWarrin40 .继承的7 点特性:a.子类拥有父类的属性和方法b.子类可以有自己行的属性和方法c.子类可以重写父类的方法d.可以声明父类,创建子类d_L声明什么类型,就只能调用什么类型的方法d_2. 创建什么类型,运行什么类型的方法d_3要使用创建类型的方法, 必须得强制转化类型。 41 .this与 super关键字一般在子类中使用上his表示调用自己声明的属性和方法super表示父类声明的属性和方法static方法中不能使用this与super关键字42 . 继承中的构造方法创建对象一定会调用构造方法? 创建子类对象一定会调用父类的构造方法? 子类默认调用父类无参构造方法? 子类只能调用父类存在的构造方法? 子类构造方法中使用S叩er调用父类构造方法, 并且super必须放在第一行? 构造方法中this表示调用本类其他构造方法,并且this必须放在第一行43. 封装定义:隐藏属性, 方法和方法实现细节的过程成为封装45. 方法的说明符方法的访问说明符1 .public任何地方都可以访问2 .protected子类或者同包, 同类可以访问, 但是其它包的非子类不可以访问3 .d e fa u lt只有同类或者同包可以访问4 .private私有的方法,这里的私有指的是被被class所私有, 其他类不能访问, 继承的类也不行方法的其他说明符1.static2 .final此方法不可以被子类覆盖3 .abstract抽象的方法4 .native 用户可以使用, 但是不能编写的类。 5 .synchronized同步的方法面向对象面向对象的程序开发实际上分为三种: 00A 00D OOP|-00A:面向对象的分析I-OOD:面向对象设计卜 0P:面向对象程序三大特性: 封装、继承、多态对象的创建及使用:Person zcy = null;〃声明对象zcy=new Person “实例化对象Personzcy = new Person();方法不需要创建, 直接使用47 . 封装性封装性有很多体现, 但是最简单的体现是假如"private"关键字48 . 实体类:在开发过程中,有一些类与数据库紧密联系其叫法有几种,常用的有entity实体类丫 类valueobject 值1; dto , data transmissionobject数据传输对象Static49.static普通变量通过对象名•变量访问; 而static变量通过类命. 变量访问, 因为static修饰的变量为类变量5O.finalz当定义一常量时, 用final修 饰 , 变量名大写, 通常情况下,final修 饰 , 前面加上static , 但是反之不成立!51 .static 方法,静态方法, 同样是通过类名. 方法名调用。 静态方法里面不能调用非静态变量; 静态方法下面不能使用this,super等关键字静态方法中不能访问普通方法, 但可以调用静态方法; 即静态方法里面不能出现非静态的东西52 . 静态块:在虚拟机加载类时就调用, 不需要等到创建对象时执行sun公司不推荐使用多态53 . 方法重载相同的方面名称, 不同的参数列表( 个数和类别不同), 同时出现在一个类中54 . 方法重写:在子类中产生与父类相同的方法头( 参数列表也相同), 但是方法体不同, 属于方法重写, 与方法重载有根本区别子类也可以重载父类的方法, 只是父子类的方法重载55 . 多态定 义 : 多种形态, 多种形式, 多种表现形态最直接的表现形式是方法重写( 父子类之间), 方法重载( 一个类里面)"抽象类, 接口都为接口服务abstract56 . 抽象方法(abstract):由abstract关键字修饰的方法叫做抽象方法, 只有方法头没有方法体56 . 抽象类(abstract):由abstract关键字修饰的类叫做抽象类只能声明, 不能创建有抽象方法的类一定是抽象类,但抽象类不一定是抽象方法当想让一个方法只能被继承, 但是不能创建时, 用到此种情况。 57 . 抽象类子类:1实现父类的所有的抽象方法,2. 或者自己声明为抽象类,3. 或者部份实现父类的方法, 但自身还是要声明成抽象类58 . 取随机数:Random random = new Random();int selectTndex =random.nextInt(3);System.out.println(selectTndex);59 . 接口 (interface):接口是一系列方法( 功 能 ) 的声明, 即没有实现任何方法的抽象类( 没有abstract关键字, 但出现也不会报错) ; 命名时, 前面加上大写字母I, 在其子类中, 子 类implements接口 ,implements在这里是实现的意思子类要么实现接口的所有方法, 要么把自己变成抽象类60 . 接口特点:一个子类可以实现多个接口, 即变相的多继承 接口可以继承接口, 一个接口可以继承多个接口接口只能声明不能创建61 . 接口的分类:a.普通接口, 即一系列方法的声明;b.常量接口, 项目中常用的一些常量C,标识接口( 空方法接 口 ), 子类实现此接口, 表示属于某个体系接口, 具有某种功能Java中级HTML知识点:Html怎么转换成jsp页面供程序员使用L 首行加上代码<%@ page language="javaH contentType=Htext/html; charset=gbk"%>2. 重命名为jsptable修饰代码 跳转服务器跳转和客户端跳转:跳转之后地址没变, 称为服务器®炼专, 地址改变称为客户端后牌专跳转方式:客户端跳转setHeader() response.setHeader("refresh" , "2;url=ddd.jsp");属于客户端跳转response.sendRedirect("DDD,JSP");客户端跳转, 页面执行完毕之后再跳转, 但是不能出传递request范围的属性.服务器跳转 d.setMaxAge(22);〃 插入此代码即可out.printlnQout.println()的换行去哪里了呢? 这个换行只是针对于源文件中的换行, 但是此换行会被HTML忽略掉, 所以如果需要换行,可以直接编写html语句两种include指令©include 指令和 范 例 : request.setAttribute("name", "dd");String ddd = (Sring)request.getAttribute("name");session属性范围仅为一个客户, 两种勤僦都可以范 例 : seesion.setAttriute("name","dddd");String dddd = (String)seesion.getAttribute("ddd")application范围是在服务器上面设置一个属性, 所以一旦设置后任何用户都可以浏览到此属性如果在服务器上设置过多的Application属 性 , 则会影响到服务器的饿性能乱码转换:产生原因:所有静态web的执行流程, 是先从服务器上取得一个页面, 之后通过把内同提交给服务器, 之后服务器在提交的内容返回给客户进行显示设置page指令后, 本页面输入的中文会得到正确的显示, 但是接受到的从其他页面的参数却还是乱码,解决方法有两个: 第一个直接把接受到的内容用服务器返回给客户的进行显示, 即加上str=newString(str.getBytes("ISO8859-l")); 〃转码 第二种方法为: 前面加上request.getCharacterEnocoding("gbk");〃按中文接受。 两种方法的区别为: 第一种是接受了再转换, 第二种是转换了再接受.接收多个同名参数在表单中,存在复选框,接收方法如下:abc若 String inst = request.getParameter(”inst”);接收内容只为选项最前面一个, 解决方法如下:String[] inst= request. getParameteValues(”inst”); 〃接收表单参数<%for(int i=O;i 登录代码<%@ page contentType=,,text/html;charset=GBK"%>vhl> 系统登录 方法的其他说明符1 . static2 .final此方法不可以被子类覆盖3 .abstract抽象的方法4 .native 用户可以使用, 但是不能编写的类5 . synchronized同步的方法面向对象面向对象的程序开发实际上分为三种: 00A 00D OOP卜 00A:面向对象的分析卜 00D:面向对象削I-OOP:面向对象程序三大特性:封装、继承、多态对象的创建及使用:Person zcy = null;〃声明对象zcy=new Person();〃实例化对象Person zcy = newPerson();方法不需要创建, 直接使用封装性封装性有很多体现, 但是最简单的体现是假如"private"关键字.循环处理次数用for,处理量的时候用while , while可以执行 次 , dwhile至少执行1次javaBeanjava Bean的两种引用方法:第一种: 先引入类, 然后创建对象, 代码如下<%@ page import="org.lxh.demo.Simple"%>Simple simple = new Simple();第二种: 用jsp中的标签指令: 基本上都是接口, 出来DriverManager是个类之外.什么是jdbc?java database connectivity.SUN指定的java应用程序了解数据库的规范, 通过一些类和接口实现odbc( 微软制定的应用程序连接数据库的规范) -->oledb( odbc升级)ado是规范的一个实现95java出现, sun制定了 java程序连接数据库的规范jdbc , 即java database coonectivity0 sun指定规范 , 微软等数据库公司实现规范供客户使用jdbc是规范的同时, 也是一门技术, 学好这门规范, 我们就可以连接各种不同的数据库.当然我们实际使用的时候操作的是DriverManager这个类, 如 Connection , statement, 等这些接口,所以说jdbc规范更具体点说是一些类和接口 ( 更主要是一些接口的集合)在我们使用java.sql包里面的任何一个类( 包括接口)的方法时,都会出现一个编译时异常 SQLException我们必须处理!cmd ipconfig 查看本机 ip程序员测试用替代本机ipl27.0.0.1 , 等价与localhoststatement接口具体方法有:a.int row = stmt.executeUpdate(sql);返回sql语句影响的行数; 插入, 通过此方法还可以实现DML: insert,update,delete; DDL:create,drop 等b.ResultSet rs = stmt.execuQuery(sql);rs 为查询的数据包 js.next。 取得遍历每行数据,rs.getlnt("ss")得到每行数据查询PrepareStatement接口具体方法有:1 . 预编译的,执行速度快;2 .addBatch();executeBatch ( )3 . 当同时执行相同sql语句时使用;4 . 防止sql注入;故而在登录时,最好用PrepareStatement处理5 . pstmt.setstring(lr nsssssssn);在不知道”sssssss”的数据类型时,都可以用pstm. setobject ()搞定pstmt = conn.prepareStatement(sql);pstmt.setstring(1, nsssssssn);pstmt.setstring(2, nssefegegen);pstmt . executeUpdate();pstmt.setstring(1, nssddddsn);pstmt.setstring(2, HaaaaeegegeH);pstmt.executeUpdate();可 优 化 为 :pstmt = conn.prepareStatement(sql);pstmt.setstring(1, nsssssssn);pstmt.setstring(2Z nssefegegen);pstmt.addBatch();pstmt.setstring(1, nssdddds");pstmt.setstring(2, naaaaeegegen);pstmt . addBatch();pstmt . executeBatch();关于局部变量:在那个大括号里面声明的, 就在本括号里面作用。 20. 在计算机程序里面, 指向第一个元素永远用0表示, 出去在jdbc中 , 例 如 :rs.getlnt("name")这里的name表示第一例的属性, 可以用rs.getlnt(l)表示关于jdbc-odbc桥连接,有些数据库如access , 没有连接数据库的jar包 , 只能用jdbc-odbc桥连接进行数据库连接 (关于连接Access的过程在视频第十二章06的 5 分钟开始 ) 首先得在电脑上设置odbc数据源;加载程序为sun.jdbc.odbcJdbcOdbcDriver; 其它操作一样桥连接基本不用三层架构表示层一>业务层- >持久化层(数据访问层) ->db . 案例在一个客厅里面, 服务员接受客户, 然后将订单给接单者, 接单者给厨房, 厨房到仓库拿菜, 做菜, 将做好的菜返回给接单者, 接单者将菜给客户dao,date access object.数据访问对象即数据访问层数据库操作步骤:1 .建立一个文件,将连接数据库的jar包加载进去2 .加载驱动程序Class. forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");调出 com.microsoft.sqlserver.jdbc.SQLServerDriver方法 1 : sqlserverdriver A+/方法 2: C+S+T 调用 driver , 接口 javasql f4 后者 c+tClass.fo「 Name()为静态方法, 通过类名点方法名调用。 class.forName()加期区动到内存;当jdbc驱动程序加载到内存时, 会自动向DriverManager注册, 然后DriverManager类就会用注册的jdbc驱动程序来创建数据库连接DriverManager.getConnection 建立连接;3 .得到连接Connection conn = DriverManager.getConnection(url, "sa"fuH写法:这里的url必须包括ip,端口号,( sqlserver为 1433 ; mysql3306 ; oraclel521) , 数据库具体格式为 :sqlserver:jdbc:sqlserver://localhost:1433;databaseName=dbName例 如:("jdbc:sqlserver://localhost;databaseNam e=TestDBnz"s a ","accpn) ;sqlserver: jdbc:sqlserver://localhost:1433;databaseName=dbNamemysql: jdbc:mydql://ip:3306/dbNameOracle: jdbc:oracle:thin:@ip:1521:dbNameAccess:jdbc:odbc:myds( 数据源名称)4 . 创建statement对象String sql = "insert into bookinfo values「跟杨志老师学 j ava, ,8 J 武汉纺织大 学 出 版 社 — 陈 刚 老 师 一 不 错,, 1nullSmall.png *, 1nulllmg.png ,,50,20,1,30);n;Statement stmt = conn.createStatement();5 . 执行sql语句int row = stmt.executeUpdate(sql);6 . 关闭释放资源连接数据库案例1 .加载驱动; 2. 取得连接; 路通了 , 得准备车3. 取车statement sta = conn.createStatement();4. 车有了,可以拉货或者干其它的事情, 货物就是sql语句, 车怎么处理这些货物, 就要研究车有哪些方法。 直接通过对象名. 方法名(sql) 来调用2 .package db;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.sql.Statement;public class DBManager {public static void main(String[] args) {try {Class . forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");System.out.printIn("yes");Connection conn =DriverManager.getConnection(njdbc:sqlserver://localhost:1433;databaseName=yzhin, “sa“, ;System.out.printin(conn);String sql = "insert into bookinfo values (, 跟杨志老师学java ' , 8,'武汉纺织大学出版社'陈刚老师一不错* z * nullSmall.png* z•nulllmg.png,,50,20,1,30);”;Statement stmt = conn.createStatement();int row = stmt.executeUpdate(sql);if (row ==1) {System, out .printin ("yes ! * ' );}else{System.out.printin(Hno!");)} catch (ClassNotFoundException e) {System.out.printIn("no");e.printStackTrace();} catch (SQLException e) {System.out.printin("non。 ");e.printStackTrace ();)))数据库操作语言insert insert into drtide(TITLE,BODY,ADDDATE,ADDUSER) values('杨志' : 彳 导 至 (T「sss','琐琐碎碎' )delete delete from article where id = 7*update update article set TITLE = *ZHANGCHOG' where id = '8'数据库相关操作Configpackage com.zcy.db;public interface Config {public static final String DRIVER* ' com. micro so ft. sqlserver . jdbc . SQLServerDriver',;public static final String URL"jdbc:sqlserver://localhost:1433;databaseName=n;public static final String DBNAME = "bookshop”;public static final String UNAME = nsan;public static final String PWD = H n;}增删改查语句范例:- insert into bookType--delete from bookTypevalues (03历史小说1 1 3 历史小说, );where bookTypeld = 9;--update bookType set parentld 2 z bookTypeName = ' 长 虫 样 ' ,isDelete1, Context ' 张重阳,where bookTypeld 8;--select bookTypeld,parentld,bookTypeName,isDelete, context frombookType where bookTypeld = 1;--select bookTypeld,parentld,bookTypeName,isDelete,context frombookType;连接数据库Class.forName("com.mysql.jdbc.Driver");String url = "jdbc:mysql://localhost/bbs?user=root&password=root";Connection conn = DriverManager.getConnection(url);Insert intoString sql="insert into article values(null,?,?,?,?,now(),0)”;PreparedStatement pstmt = conn.prepareStatement(sql);pstmt.setlnt(ljd);pstmt. setl n t( 2Z rootid);pstmt.setString(3ztitle);pstmt.setString(4,cont);pstmt.executellpd ate();手动提交更改后的数据conn.setAutoCom mit(false);mit();conn.setAutoComm it(true);传 idstr+=" 接收字符串时候, 空格得不到显示, 用 replaceAII,例 如 , cont=cont.replaceAII("\n"z"鼠标来去特效
VTH> 与 VTD> 区另 I J同样是标示一个储存格, 唯一不同的是 所标示的储存格中的文字是以粗体出现URL重写jjj.jsp?参数名称= 参数值& 参数名称= 参数值& 参数名称= 参数值方法重写可以通过链接页面跳转传递参数, 其作用和表单中的隐藏域作用一样。
姓 名: <%=simple.getName()%x/h2>使用js p指令操作:
,,+rs.getInt(',id")+" "+,,"+rs.getString(”title")+”v/a>"+“v/td>vtr>”;接 收 idString strid = request.getParameter("id");int id = Integer.parselnt(strid);或者 int id = Integer.parseInt(request.getParameter("id"));String amdin=(String)seesion.getAttribute("admin");注 意 : request.getParameter("")得到的是字符串, 若原为数字, 得转换!接收字符串, seesion.getAttribute(”admin”)得到的是object类型, 得转换为string类型。
");中文的接收问题接受前转换: request.setCharacterEncoding("GB18030");成员变量当一个变量为成员变量的时候, 没显示一次, 就会累积, 所以每次显示后得设为空, 例 如 :<%=str%x%str=""; %>用户登录 (action传值)瑜正:< %String action = request.getParameter("action,');if (action != null && action.equals("login")) {String username = request.getParameter("uname");String password = request.getParameter("pwd");if (username == null || !username.equals("admin")) {out.printing用户名错误!") ;} else if (password == null || 'password.equals(nadmin")) {out.printin( "密码错误!") ;//return;} else {session.setAttribute("admin"z "true");response.sendRedirect("ShowArticleTree.jsp");)}% >表 单: