• 1.98 MB
  • 2022-04-22 11:23:40 发布

Java语言程序设计教程 第二版 (邱桃荣 著) 机械工业出版社 课后答案

  • 93页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'课后答案网:www.hackshp.cn课后答案网您最真诚的朋友www.hackshp.cn网团队竭诚为学生服务,免费提供各门课后答案,不用积分,甚至不用注册,旨在为广大学生提供自主学习的平台!课后答案网:www.hackshp.cn视频教程网:www.efanjy.comPPT课件网:www.ppthouse.com课后答案网www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cn习题一1.简述面向对象软件开发方法的重要意义。【答】:面向对象的软件开发方法按问题论域来设计模块,以对象代表问题解的中心环节,力求符合人们日常的思维习惯,采用“对象+消息”的程序设计模式,降低或分解问题的难度和复杂性,从而以较小的代价和较高的收益获得较满意的效果,满足软件工程发展需要。2.解释下面几个概念:1)对象2)实例3)类4)消息5)封装6)继承7)多态【答】:1)对象:就是现实世界中某个具体的物理实体在计算机中的映射和体现,是由属性和操作所构成的一个封闭整体。2)实例:是对象在计算机内存中的映像。3)类:是描述对象的“基本原型”,是描述性的类别或模板,即对一组对象的抽象。它定义一组对象所能拥有的共同特征,用以说明该组对象的能力与性质。4)消息:消息是对象之间进行通信的一种数据结构。5)封装:封装性是保证软件部件具有优良的模块性的基础。面向对象的类是封装良好的模块,类定义将其说明(用户可见的外部接口)与实现(用户不可见的内部实现)显式地分开,其内部实现按其具体定义的作用域提供保护。6)继承:继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。7)多态:多态性是指一个名字具有多种语义,即指同一消息为不同对象所接受时,可以导致不同的操作。3.对象“汽车”与对象课后答案网“小汽车”是什么关系,对象“汽车”与“轮胎”又是什么关系?【答】:对象“汽车”与对象“小汽车”具有继承关系,即对象“小汽车”继承了对象“汽车”。“轮胎”是对象“汽车”的一个属性,所以对象“汽车”包含“轮胎”,二者是包含关系。www.hackshp.cn4.简述Java语言的主要特点。【答】:Java语言的主要特点:(1)简单性(2)面向对象(3)分布式(4)健壮性(5)结构中立(6)安全性(7)可移植(8)解释的(9)高性能(10)多线程(11)动态性5.简述Java语言与C/C++语言的主要差异。【答】:Java基于C++,与之有许多相似之处,但其设计更易于使用,它们之间主要差异有: (1)Java中无C/C++中最复杂并有潜在危险的指针(2)Java无C/C++中的#include、#define和头文件。 (3)Java无C/C++中的structure,union及typedef。若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cn (4)Java无C/C++中的函数、指针和多重继承。 (5)Java无C/C++中的goto指令。 (6)Java无C/C++中的操作符重载(OperatiorOverloading)、自动类型的转换。(7)Java系统要求对对象进行相容性检查,以防止不安全的类型转换。(8)Java语言最强大的特性之一是它的平台独立性,Java可以处理好平台之间的移植问题。 (9)Java语言中没有全局变量的定义,只能通过公用的静态的变量实现,从而减少了引起错误的地方。6.什么叫Java虚拟机?什么叫Java的字节码?【答】:Java虚拟机是一个软件系统,它可以翻译并运行Java字节码。它是Java的核心,保证了在任何异构的环境下都可运行Java程序,解决了Java的跨平台的问题。Java的字节码(byte‐code)是与平台无关的是虚拟机的机器指令7.简述Java程序的运行过程。【答】:首先编写Java源代码程序,通过Java虚拟机编译成.class的字节码程序。然后通过然后再执行翻译所生成的字节代码,属于先解释后执行方式。在运行时,字节码载入器用于调入包含、继承所用到的所有类,确定内存分配,变成真正可执行的机器码。由,再通过字节码校验器就是用于检验字节码是否正确,如果通过校验,再由系统执行平台解释执行。8.Java程序分哪两类?各有什么特点?【答】:Java程序根据程序结构的组成和运行环境的不同可以分为两类:JavaApplication(Java独立应用程序)和Java课后答案网Applet(Java小应用程序)。Java独立应用程序是一个完整的程序,需要独立的Java解释器来解释执行;而Java小应用程序则是嵌在Web页面中的非独立应用程序,由Web浏览器内部所包含的Java解释器来解释执行,为Web页面增加交互性和动态性。www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cn习题二1.Java语言对标识符命名有何规定,下面这些标识符哪些是合法的,哪些是不合法的。1)Myname2)JavaLanguage3)2Person4)_is_Has5)$12345。【答】:合法的标识符有:Myname、JavaLanguage、_is_Has非法的标识符有:2Person、$123452.Java有哪些基本数据类型,与C/C++相比有何特点?复合数据类型是哪几种?【答】:基本数据类型有:整型数据类型(字节整型、短整型、整型、长整型),实数数据类型(单精度实数、双精度实数),字符数据类型和布尔数据类型。与C/C++相比,Java的数据类型与C++相似,但有两点不同:①在Java语言中所有的数据类型是确定的,与平台无关,所以在Java中无sizeof操作符;②Java中每种数据类型都对应一个默认值。这两点体现了Java语言的跨平台性和完全稳定性。Java的复合类型是由用户根据需要自己定义并实现其运算的数据类型,主要有类类型、接口和数组等。3.Java的字符类型采用何种编码方案?有何特点?【答】:Java的字符类型采用16位Unicode(全球文字共享编码)方式,用16位来表示东西方字符。由于采用Unicode编码方案,使得Java在处理多语种的能力方面得到大大提高,从而为Java程序在基于不同语种之间实现平滑移植铺平了道路。4.Java有哪些运算符和表达式?请写出下面这些表达式的运算结果(设课后答案网a=2,b=–3,f=true)。1)––a%b++2)(a>=1)&&a<=12?a:b)3)f^(a>b)4)(––a)<=1)&&a<=12?a:b)的结果是:13)f^(a>b)的结果是:false4)(––a)<关于字符串替换4.阅读下面的程序,写出程序的运行结果。importjava.util.*;publicclassStringTest{publicstaticvoidmain(Stringargs[]){课后答案网Strings1="IloveJava.";Strings2="IlikeJava.";Strings3="IlikeJava.";StringBuffers4=newStringBuffer(s1);www.hackshp.cnStringBuffers5=newStringBuffer("Append");charc1[]=newchar[s1.length()];System.out.println("s1的长度="+s1.length());System.out.println("s1和s2相同吗?"+(s1.compareTo(s2)==0?"相同":"不同"));System.out.println("s2和s3相同吗?"+(s2.compareTo(s3)==0?"相同":"不同"));System.out.println("s1连接s2后的字符串为:"+s1.concat(s2));System.out.println(s1.startsWith("J",7));System.out.println(s1.endsWith("."));s1.getChars(0,s1.length(),c1,0);for(inti=0;i0)s=newint[length];//初始化队列top=rear=0;//队列空;}publicintgetTop(){//获取队头元素;if(!isEmpty()){returns[top];}return0;}publicintgetRear(){//获取队尾元素;if(!isEmpty()){returns[rear];}return0;}publicvoidenQueue(intcontent){//进队列;if(!isFull()){s[rear]=content;rear=(rear+1)%length;}}课后答案网publicvoiddelQueue(){//出队列if(!isEmpty()){top=(top+1)%length;}}www.hackshp.cnpublicbooleanisFull(){//判断队列满if((rear+1)%length==top)returntrue;returnfalse;}publicbooleanisEmpty(){//判断队列空if(rear==top)returntrue;returnfalse;}}9.编程定义一个栈类,它封装了栈数组,判断栈空方法、栈满方法以及进栈和出栈方法。【答】:若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cn栈类Stack的定义如下列代码所示:packagejavabook.answer.ch04;publicclassEX9{privateintlength;privateinttop;privateint[]s;publicEX9(intlen){//初始化空栈this.length=len;//设置栈的空间大小if(len>0)s=newint[len];top=0;//设置为空栈}publicintgetTop(){//获得栈顶元素returns[top];}publicbooleanisFull(){//判断栈满if(top+1>length){returntrue;}returnfalse;}publicbooleanisEmpty(){//判断栈空if(top<1)returntrue;returnfalse;}publicvoidpush(intcontent){//进栈if(!isFull())s[++top]=content;课后答案网}publicvoidpop(){//出栈if(!isEmpty()){--top;}www.hackshp.cn}}10.编写一个类实现复数的运算。【答】:定义复数的类Complex,代码如下:packagejavabook.answer.ch04;publicclassEX10{privatedoublereal;privatedoubleimage;publicEX10(doublereal,doubleimage){super();this.real=real;若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cnthis.image=image;}publicdoublegetImage(){returnimage;}publicvoidsetImage(doubleimage){this.image=image;}publicdoublegetReal(){returnreal;}publicvoidsetReal(doublereal){this.real=real;}publicEX10add(EX10b){//复数相加returnnewEX10(this.getReal()+b.getReal(),this.getImage()+b.getImage());}publicEX10sub(EX10b){//复数相减returnnewEX10(this.getReal()-b.getReal(),this.getImage()-b.getImage());}publicEX10multiple(EX10b){//复数相乘doublereal,image;real=this.getReal()*b.getReal()-this.getImage()*b.getImage();image=this.getReal()*b.getImage()+this.getImage()*b.getReal();returnnewEX10(real,image);课后答案网}publicEX10div(EX10b){//复数相除doublereal,image,temp;temp=Math.pow(b.getReal(),2)+Math.pow(b.getImage(),2);real=(this.getReal()*b.getReal()+www.hackshp.cnthis.getImage()*b.getImage())/temp;image=(this.getImage()*b.getReal()-this.getReal()*b.getImage())/temp;returnnewEX10(real,image);}publicstaticvoidmain(Stringargs[]){EX10a=newEX10(3,4);EX10b=newEX10(3,-3);EX10result;System.out.println("复数相加:");result=a.add(b);System.out.println(""+result.getReal()+"+i"+result.getImage());System.out.println("复数相乘:");result=a.multiple(b);System.out.println(""+result.getReal()+"+i"+result.getImage());System.exit(0);若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cn}}课后答案网www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cn习题五1.子类将继承父类所有的属性和方法吗?为什么?在什么情况下会出现子类对父类变量的隐藏?什么情况下出现子类对父类方法的覆盖?试举一例。【答】:子类继承父类的共有和保护类型的方法和属性,但是对于父类的私有方法和属性无法继承。如果子类覆盖了父类的静态方法,父类的方法被隐藏。而覆盖是子类具有重新定义父类成员方法的能力,例如:智能手机是手机的子类,手机可以打电话,而智能手机可以具有打电话并增加传递视频信号的功能,重新定义手机打电话的功能。2.方法的覆盖和方法的重载有什么不同?【答】:方法的覆盖是子类重新定义父类的成员方法,这意味着子类定义的方法具有和父类的方法具有同方法名、同参数类型、同参数类型以及同返回值。而方法的重载是在同一个类中定义同名方法的情况,这些同名方法除了方法名相同,但方法签名必须不同。3.接口是什么?它将起何种作用?如何定义接口?如何使用接口?假设复数类实现了一个四则运算的接口,试编程建立并使用这个接口?【答】:接口是为外界提供运算,并不提供运算的结构或具体的实现内容。接口是通过interface来实现的,形如“interface接口名”。实现复数四则运算的接口代码如下:packagejavabook.answer.ch05;interfaceComplexCounter{publicabstractEX3add(EX3b);publicabstractEX3sub(EX3b);publicabstractEX3div(EX3b);publicabstractEX3mul(EX3b);}课后答案网publicclassEX3implementsComplexCounter{privatedoublereal;privatedoubleimage;publicEX3(doublereal,doublewww.hackshp.cnimage){super();this.real=real;this.image=image;}publicdoublegetImage(){returnimage;}publicvoidsetImage(doubleimage){this.image=image;}publicdoublegetReal(){returnreal;}若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cnpublicvoidsetReal(doublereal){this.real=real;}publicEX3add(EX3b){//复数相加returnnewEX3(this.getReal()+b.getReal(),this.getImage()+b.getImage());}publicEX3sub(EX3b){//复数相减returnnewEX3(this.getReal()-b.getReal(),this.getImage()-b.getImage());}publicEX3mul(EX3b){//复数相乘doublereal,image;real=this.getReal()*b.getReal()-this.getImage()*b.getImage();image=this.getReal()*b.getImage()+this.getImage()*b.getReal();returnnewEX3(real,image);}publicEX3div(EX3b){//复数相除doublereal,image,temp;temp=Math.pow(b.getReal(),2)+Math.pow(b.getImage(),2);real=(this.getReal()*b.getReal()+this.getImage()*b.getImage())/temp;image=(this.getImage()*b.getReal()-this.getReal()*b.getImage())/temp;returnnewEX3(real,image);}}4.计算课后答案网式1:y=x+x/2+x/3+……+x/n;式2:y=x+x/2!+x/3!+……+x/n!;要求:○1x为实数,n为正整数。○2任意输入n,当n为奇数时,按照式1计算,当n为偶数时,按照式2计算。○3利用继承机制编程。www.hackshp.cn【答】:MathCounter程序,实现式1运算如下:packagejavabook.answer.ch05;interfaceCounter{publicabstractdoublesum();publicabstractdoublediv(doublex,intn);}publicclassEX4aimplementsCounter{privateintn;privatedoublex;publicEX4a(doublex,intn){this.n=n;若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cnthis.x=x;}publicdoublesum(){doubleresult=0;if(n>0)for(inti=1;i<=n;i++){result+=div(x,i);}returnresult;}publicdoublediv(doublex,intn){if(n!=0)returnx/n;return0;}}FacMathCounter程序,实现式2的运算以及运算测试如下:packagejavabook.answer.ch05;importjava.util.*;publicclassEX4bextendsEX4a{privatedoublex;privateintn;publicEX4b(doublex,intn){super(x,n);this.x=x;this.n=n;}publicdoublediv(double课后答案网x,intn){returnx/fac(n);}publicdoublefac(intn){intresult=1;for(inti=1;i<=n;i++)www.hackshp.cnresult*=i;returnresult;}publicstaticvoidmain(Stringargs[]){Scannerin=newScanner(System.in);EX4as;System.out.println("输入实数:");doublexx=in.nextDouble();System.out.println("输入整数:");intnn=in.nextInt();if(nn%2==0)s=newEX4b(xx,nn);elses=newEX4a(xx,nn);System.out.println("运算结果是:"+s.sum());若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cnSystem.exit(0);}}5.编程通过继承线性表实现栈数据结构以及操作。【答】:线性表LineList类的定义如下:packagejavabook.answer.ch05;publicclassEX5LineList{char[]list;intcur;//当前元素publicEX5LineList(char[]list){this.list=list;cur=0;}publicvoiddestroyList(){//销毁线性表this.list=null;cur=-1;}publicintgetLength(){//获取线性表的长度returnthis.list.length;}publicchargetElement(intindex){//获取指定位置的元素if(index=0)returnlist[index];return0;}publicintgetLocation(char课后答案网c){//获取指定元素的位置for(inti=0;i0&&cur=0&&cur=0){for(inti=index;i<=cur;i++)list[i]=list[i+1];returntrue;}returnfalse;}}继承线性表LineList的栈Stack类的定义如下:packagejavabook.answer.ch05;publicclassEX5StackextendsEX5LineList{char[]list;inttop;publicEX5Stack(char[]list){super(list);this.list=list;top=0;}publicvoidpush(charc){if(insert(c))top++;}publicvoidpop(){if(delete(top))top--;}课后答案网publicchargetTop(){returngetElement(top);}}www.hackshp.cn6.利用接口编写三角形、梯形面积及周长的程序。【答】:packagejavabook.answer.ch05;importjava.util.*;interfaceTriInf{publicabstractdoublearea();publicabstractdoubleperimeter();}publicclassEX6implementsTriInf{doublea=0,b=0,c=0;//定义三边长;若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cnpublicEX6(doublea,doubleb,doublec){this.a=a;this.b=b;this.c=c;}publicdoublearea(){doubled=(a+b+c)/2;returnMath.sqrt(d*(d-a)*(d-b)*(d-c));}publicdoubleperimeter(){returna+b+c;}publicstaticvoidmain(Stringargs[]){Scannerin=newScanner(System.in);doubleaa,bb,cc;System.out.println("输入三角形三边:");aa=in.nextDouble();bb=in.nextDouble();cc=in.nextDouble();EX6t=newEX6(aa,bb,cc);System.out.println("三角形的面积="+t.area()+",三角形的周长="+t.perimeter());System.exit(0);}}课后答案网www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cn习题六1.如何创建一个List或Set对象?使用它们存放数据时哪种对象不能存放重复元素?【答】:可以使用关键字new调用相应构造函数创建List或Set对象。(1)要创建List对象时可使用以下方法:Listlist=newArrayList();或ArrayListarraylist=newArrayList();或LinkedListlinkedlist=newLinkedList();等等。(2)要创建Set对象则调用相应的构造函数:HashSethashset=newHashSet();等。Set定义的集合中不能包含相同的元素。2.列举几种可以遍历集合对象中元素的方法。【答】:可以使用Iterator接口定义的方法来遍历类集,或直接使用循环语句来对集合中对象进行遍历。3.如何向一个HashMap对象中添加元素?【答】:通过调用Map接口中定义好的put()方法可以该对象中添加相应的元素,该方法原型为Objectput(Objectkey,Objectvalue)。如若已经建立了一个HashMap对象hashmap,则可使用hashmap.put(“关键字”,“元素值”)来向hashmap对象添加元素及该元素的值。4.使用本章介绍的一种集合类型编写程序,实现从控制台任意输入若干名字,如Mike、Jone、Benny……,将它们以字典序按升序方式输出。【答】:packagejavabook.answer.ch06;importjava.util.*;importjava.io.*;课后答案网publicclassch6exe4{publicstaticvoidmain(String[]args)throwsIOException{Listlist=newArrayList();System.out.println("请输入若干学生姓名(输入"exit"则终止输入):");BufferedReaderbuf=newBufferedReader(newInputStreamReader(System.in));Stringstr=buf.readLine();www.hackshp.cnwhile(!str.equals("exit")){list.add(str);str=buf.readLine();}buf.close();Collections.sort(list);System.out.println("您输入的学生有(按字典序排列):");Iteratori=list.iterator();while(i.hasNext()){Stringt=(String)i.next();System.out.println(t);}}}5.从下面文本中计算单词“Java”、“language”、“simple”的出现次数,并按次数从若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cn大到小输出结果。文本内容为:Javaiscertainlyagoodprogramminglanguage.Javawasneverjustalanguage.Javaisawholeplatform.Javahasalotofnicelanguagefeatures.Java2Dwasdesignedsothatsimpleoperationsaresimpleandcomplexoperationsarefeasible.【答】:packagejavabook.answer.ch06;importjava.util.*;publicclassch6exe5{publicstaticvoidmain(String[]args){Stringtext="Javaiscertainlyagoodprogramminglanguage."+"Javawasneverjustalanguage.Javaisawholeplatform."+"Javahasalotofnicelanguagefeatures."+"Java2Dwasdesignedsothatsimpleoperationsaresimpleandcomplexoperationsarefeasible.";intcount=0;intflag[]={0,0,0};MaphashMap=newHashMap();StringTokenizerst=newStringTokenizer(text,".");Stringkey[]={"Java","language","simple"};while(st.hasMoreTokens()){Stringk=st.nextToken();for(inti=0;i<3;i++){if(k.equals(key[i])){flag[i]=1;if(hashMap.get(k)!=null){count=((Integer)hashMap.get(k)).intValue();count++;hashMap.put(k,newInteger(count));}else{hashMap.put(k,newInteger(1));}}}课后答案网}for(inti=0;i<3;i++){if(flag[i]==0)hashMap.put(key[i],newInteger(0));}Mapmap=newTreeMap(hashMap);www.hackshp.cnSetset=map.entrySet();Iteratoriterator=set.iterator();System.out.println("待统计的文本为:");System.out.println(text);System.out.println("以下为要统计的单词及出现的次数(按次数从高到低排列):");while(iterator.hasNext()){System.out.println(iterator.next());}}}6.编写程序实现对任意消息窗口中输入的整数,输出该整数的所有因子。请使用Stack类来存放因子,并在程序中使用本章中介绍的泛型指定Stack对象存储的元素类型。【答】:packagejavabook.answer.ch06;若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cnimportjava.util.*;importjavax.swing.JOptionPane;publicclassch6exe6{publicstaticvoidmain(String[]args){Stackstack=newStack();Strings;s=JOptionPane.showInputDialog("请输入一个整数:");intn=Integer.parseInt(s);for(inti=1;i<=n;i++){if(n%i==0)stack.push(i);}Stringstr="整数"+s+"的因子有:n";while(!stack.empty()){inti=stack.pop();str+=i+"n";}JOptionPane.showMessageDialog(null,str,"显示输入整数的因子",JOptionPane.INFORMATION_MESSAGE);}}}7.编写一个Applet,显示当前日期和时间。显示的文字颜色、字体、大小均在HTML文件中定义。提示:可以使用java.util包中的Calendar类,该类提供了年、月、日、小时、分、秒等信息,可以使用intget(intcalendarField)方法来返回由参数calendarField指定的分量值,如若实参为Calendar.YEAR,则该方法将返回当前的年份。因此可通过calendarField指定的分量Calendar.YEAR、Calendar.MONTH、Calendar.DATE、Calendar.HOUR、Calendar.MINUTE和Calendar.SECOND调用get()方法来取得当前的日期和时间。【答】:课后答案网
//题7程序源代码ch6exe7.javapackagejavabook.answer.ch06;若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cnimportjava.awt.*;importjava.applet.*;importjava.util.*;importjava.text.*;publicclassch6exe7extendsApplet{Stringmsg,font,nowdate,nowtime;intx,y,fontcolor,size;publicvoidinit(){msg=getParameter("message");x=Integer.parseInt(getParameter("X_Position"));y=Integer.parseInt(getParameter("Y_Position"));fontcolor=Integer.parseInt(getParameter("fontcolor"),16);font=getParameter("font");size=Integer.parseInt(getParameter("size"));SimpleDateFormatfomatter1=newSimpleDateFormat("yyyy-MM-dd");SimpleDateFormatfomatter2=newSimpleDateFormat("hh:mm:ss");Datedate=newDate();nowdate=fomatter1.format(date);nowtime=fomatter2.format(date);}publicvoidpaint(Graphicsg){Fontf=newFont(font,Font.BOLD,size);g.setFont(f);g.setColor(newColor(fontcolor));g.drawString("Todayis:"+nowdate,50,40);g.drawString("Nowthetimeis:"+nowtime,50,70);}}课后答案网www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cn习题七1.什么是图形上下文,在Java2和Java2D中,如何实现对图形上下文的管理?【答】:图形上下文有时也称为图形环境,指允许用户在屏幕绘制图形的信息,它由Graphics类封装,可以通过Component类的getGraphics()方法返回获得。图形上下文表示一个绘制图层,如组件的显示区、打印机上的一页、或一个屏幕外图像缓冲区。它提供了绘制三种图形对象的方法:形状、文本和图像。在Java中,可以通过Graphics的对象对图形上下文进行管理。2.Graphics2D的属性有哪些,分别实现什么功能?【答】:Graphics2D对象有6种属性,包括paint、stroke、font、transform、clip和composite。(1)paint——该属性确定所绘制线条的颜色,以及填充图形的颜色和图案等。(2)stroke——该属性可以确定线条的类型以及粗细,还有线段端点的形状。(3)font——该属性可以确定所显示字符串的字体。(4)transform——该属性确定了图形绘制过程中要应用的转换方法,通过指定转换方法可将所画内容进行平移、旋转和缩放(5)clip——该属性定义了组件上某区域的边界。(6)composite——该属性定义了如何绘制重叠的几何图形,使用合成规则可以确定重叠区域的显示效果。3.编写程序,使用柱形显示以下信息:90~100:10人(用蓝色矩形表示),80~90:20人(用灰色矩形表示),70~80:40人(用绿色矩形表示),60~70:20人(用橙色矩形表示),60以下:10人(用红色矩形表示)。程序结果如图7-18所示。课后答案网www.hackshp.cn图7-18第3题程序显示结果【答】:packagejavabook.answer.ch07;importjava.awt.*;importjava.awt.geom.*;importjavax.swing.*;publicclassch7exe3extendsJFrame{publicch7exe3(){super();setTitle("Exercise7.3");setSize(500,300);若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cnsetVisible(true);}publicvoidpaint(Graphicsg){Graphics2Dg2=(Graphics2D)g;Line2Dl=newLine2D.Double(50,250,450,250);g2.draw(l);Rectangle2Dr1=newRectangle2D.Double(100,200,60,50);g2.setColor(Color.blue);g2.fill(r1);Rectangle2Dr2=newRectangle2D.Double(160,150,60,100);g2.setColor(Color.gray);g2.fill(r2);Rectangle2Dr3=newRectangle2D.Double(220,50,60,200);g2.setColor(Color.green);g2.fill(r3);Rectangle2Dr4=newRectangle2D.Double(280,150,60,100);g2.setColor(Color.orange);g2.fill(r4);Rectangle2Dr5=newRectangle2D.Double(340,200,60,50);g2.setColor(Color.red);g2.fill(r5);g2.setColor(Color.black);g2.drawString("90~100",105,270);g2.drawString("10人",115,190);g2.drawString("80~90",170,270);g2.drawString("20人",175,140);g2.drawString("70~80",230,270);g2.drawString("40人课后答案网",235,40);g2.drawString("60~70",290,270);g2.drawString("20人",295,140);g2.drawString("60以下",350,270);g2.drawString("10人",355,190);}publicstaticvoidmain(String[]args){www.hackshp.cnch7exe3e=newch7exe3();e.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}}若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cn4.编写程序,使用扇形图显示以下信息:90~100:10%,80~90:20%,70~80:40%,60~70:20%,60以下:10%。程序结果如图7-19所示。图7-19第4题程序显示结果【答】:packagejavabook.answer.ch07;importjava.awt.*;importjava.awt.geom.*;importjavax.swing.*;publicclassch7exe4extendsJFrame{publicch7exe4(){super();setTitle("Exercise7.4");setSize(300,300);setVisible(true);}publicvoidpaint(Graphicsg){Graphics2Dg2=(Graphics2D)g;intx=getWidth()/2;inty=getHeight()/2;课后答案网Arc2Dr1=newArc2D.Double(x-120,y-120,240,240,0,36,Arc2D.PIE);g2.setColor(Color.magenta);g2.fill(r1);Arc2Dr2=newArc2D.Double(x-120,y-120,240,240,36,72,Arc2D.PIE);g2.setColor(Color.LIGHT_GRAY);www.hackshp.cng2.fill(r2);Arc2Dr3=newArc2D.Double(x-120,y-120,240,240,108,144,Arc2D.PIE);g2.setColor(Color.green);g2.fill(r3);Arc2Dr4=newArc2D.Double(x-120,y-120,240,240,252,72,Arc2D.PIE);g2.setColor(Color.orange);g2.fill(r4);Arc2Dr5=newArc2D.Double(x-120,y-120,240,240,324,36,Arc2D.PIE);g2.setColor(Color.red);g2.fill(r5);g2.setColor(Color.black);g2.drawString("90~100:10%",200,135);若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cng2.drawString("80~90:20%",150,80);g2.drawString("70~80:40%",50,145);g2.drawString("60~70:20%",150,230);g2.drawString("60以下:10%",200,175);}publicstaticvoidmain(String[]args){ch7exe4e=newch7exe4();e.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}}5.使用Graphics2D绘制静止时钟的钟面,要求绘制出整点刻度以及时钟的时针和分针且时钟显示为3点30分。【答】:packagejavabook.answer.ch07;importjava.awt.*;importjavax.swing.*;publicclassch7exe5extendsJFrame{publicch7exe5(){super();setTitle("Ch7Exercise5");setSize(300,200);setVisible(true);}publicvoidpaint(Graphicsg){Graphics2Dg2=(Graphics2D)g;intx=150,y=100,radius=70;g2.drawOval(80,30,140,140);g2.drawString("12",145,42);g2.drawString("11",(int)(x-radius*Math.cos(2*Math.PI/6)),(int)(y-radius*Math.sin(2*Math.PI/6)+10));g2.drawString("10",课后答案网(int)(x-radius*Math.cos(Math.PI/6)),(int)(y-radius*Math.sin(Math.PI/6))+10);g2.drawString("9",83,105);g2.drawString("8",(int)(x-radius*Math.cos(Math.PI/6)+5),(int)(y+radius*Math.sin(Math.PI/6)));g2.drawString("7",(int)(x-radius*Math.cos(2*Math.PI/6)),(int)(y+radius*Math.sin(2*Math.PI/6)));g2.drawString("6",147,167);g2.drawString("5",(int)(x+radius*Math.cos(2*Math.PI/6)-10),(int)(y+radius*Math.sin(2*Math.PI/6)));www.hackshp.cng2.drawString("4",(int)(x+radius*Math.cos(Math.PI/6)-10),(int)(y+radius*Math.sin(Math.PI/6)));g2.drawString("3",210,103);g2.drawString("2",(int)(x+radius*Math.cos(Math.PI/6)-10),(int)(y-radius*Math.sin(Math.PI/6)+10));g2.drawString("1",(int)(x+radius*Math.cos(2*Math.PI/6)-10),(int)(y-radius*Math.sin(2*Math.PI/6))+10);intml=45;intxm=(int)(x+ml*Math.sin(30*2*Math.PI/60));intym=(int)(y-ml*Math.cos(30*2*Math.PI/60));g2.drawLine(x,y,xm,ym);inthl=35;intxh=(int)(x+hl*Math.sin(3.5*2*Math.PI/12));intyh=(int)(y-hl*Math.cos(3.5*2*Math.PI/12));g2.drawLine(x,y,xh,yh);}若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cnpublicstaticvoidmain(String[]args){ch7exe5c=newch7exe5();c.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}}6.使用Graphics2D绘制一个立方体和六边形,并使用渐变填充方式填充立方体,使用纹理填充方式填充六边形,且六边形的外边框轮廓宽度为5【答】:packagejavabook.answer.ch07;importjava.awt.*;importjava.awt.geom.*;importjava.awt.image.BufferedImage;importjavax.swing.*;publicclassch7exe6extendsJFrame{publicch7exe6(){super();setTitle("Ch7Exercise6");setSize(300,200);setVisible(true);}publicvoidpaint(Graphicsg){Graphics2Dg2=(Graphics2D)g;Rectangle2Dr=newRectangle2D.Float(20,80,100,100);g2.draw(r);GeneralPathpath1=newGeneralPath();path1.moveTo(20,80);path1.lineTo(40,45);path1.lineTo(140,45);path1.lineTo(120,80);课后答案网path1.lineTo(20,80);g2.draw(path1);GeneralPathpath2=newGeneralPath();path2.moveTo(120,80);path2.lineTo(120,180);www.hackshp.cnpath2.lineTo(140,145);path2.lineTo(140,45);path2.lineTo(120,80);g2.draw(path2);Point2Dp1=newPoint2D.Double(20,80);Point2Dp2=newPoint2D.Double(70,130);GradientPaintgp=newGradientPaint(p1,Color.white,p2,Color.black,true);g2.setPaint(gp);g2.fill(r);p1=newPoint2D.Double(20,80);p2=newPoint2D.Double(80,60);gp=newGradientPaint(p1,Color.white,p2,Color.black,true);g2.setPaint(gp);g2.fill(path1);若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cnp1=newPoint2D.Double(140,45);p2=newPoint2D.Double(130,112.5);gp=newGradientPaint(p1,Color.white,p2,Color.black,true);g2.setPaint(gp);g2.fill(path2);GeneralPathpath3=newGeneralPath();path3.moveTo(290,100);path3.lineTo((230+60*Math.cos(2*Math.PI/6)),(100-60*Math.sin(2*Math.PI/6)));path3.lineTo((230+60*Math.cos(2*2*Math.PI/6)),(100-60*Math.sin(2*2*Math.PI/6)));path3.lineTo((230+60*Math.cos(3*2*Math.PI/6)),(100-60*Math.sin(3*2*Math.PI/6)));path3.lineTo((230+60*Math.cos(4*2*Math.PI/6)),(100-60*Math.sin(4*2*Math.PI/6)));path3.lineTo((230+60*Math.cos(5*2*Math.PI/6)),(100-60*Math.sin(5*2*Math.PI/6)));path3.lineTo(290,100);Strokestroke=newBasicStroke(5.0f);g2.setStroke(stroke);g2.setColor(Color.black);g2.draw(path3);BufferedImageimage=newBufferedImage(10,10,BufferedImage.TYPE_INT_RGB);Graphics2Dbg=image.createGraphics();bg.setColor(Color.yellow);bg.fillOval(0,0,5,5);bg.setColor(Color.red);bg.fillOval(0,5,5,5);bg.setColor(Color.green);bg.fillOval(5,0,5,5);bg.setColor(Color.blue);bg.fillOval(5,5,5,5);Rectangle2Dr1=newRectangle2D.Double(0,0,10,10);TexturePainttp=newTexturePaint(image,r1);g2.setPaint(tp);g2.fill(path3);课后答案网}publicstaticvoidmain(String[]args){ch7exe6c=newch7exe6();c.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}www.hackshp.cn}若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cn习题八1.AWT包的GUI组件和Swing包的GUI组件有哪些不同?【答】:Swing包和AWT包的GUI具有类似的组件,不同之处在于:与AWT的GUI组件相比,Swing是轻量级元件。SWING提供许多比AWT更好的屏幕显示元素。它们用纯Java写成,所以同Java本身一样可以跨平台运行。2.什么是重量级组件?什么是轻量级组件?二者的区别是什么?【答】:依靠本地方法实现功能的组件称为重量级组件,而反之为轻量级的组件。二者的区别判断的依据是否是依赖本地方法。3.什么是MVC模式?请举例说明。【答】:MVC是一种设计模式,M表示Model,说明业务模型,也就是组件的状态和行为,V表示View视图,处理用户界面的显示;C表示Controller控制器,用来控制用户输入。例如:javax.swing.JButton的组件实例中,一个JButton按钮组件中Model说明了该按钮的状态、操作内部状态、添加删除监听事件、发生的事件;按钮的视图和控制器由一个接口ButtonUI完成。如果一个类实现了这个接口,那么它将会负责创建一个用户界面,处理用户的操作。涉及的方法可以被分为三大类:绘制Paint、返回几何类型的信息和处理事件。4.编写一个Java程序,实现用户密码输入界面。【答】:实现用户密码输入的界面见下列程序。packagejavabook.answer.ch08;importjavax.swing.*;课后答案网importjava.awt.*;publicclassEX4extendsJFrame{JLabeluserLabel;JTextFielduserText;JLabelpasswordLabel;www.hackshp.cnJPasswordFieldpassword;JButtonconfirmBtn;publicEX4(){super("密码输入");userLabel=newJLabel("用户名:");passwordLabel=newJLabel("密码:");userText=newJTextField(10);password=newJPasswordField(10);confirmBtn=newJButton("确认");Containercontainer=getContentPane();container.setLayout(newFlowLayout());container.add(userLabel);container.add(userText);container.add(passwordLabel);container.add(password);若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cncontainer.add(confirmBtn);pack();setVisible(true);try{UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");SwingUtilities.updateComponentTreeUI(this);}catch(Exceptione){JOptionPane.showMessageDialog(null,this);}}publicstaticvoidmain(Stringargs[]){EX4cpf=newEX4();cpf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}}5.编写一个Java程序Counter.java,实现一个计算机器的图形界面。【答】:Counter.java的程序见下列代码:packagejavabook.answer.ch08;importjava.awt.*;importjavax.swing.*;publicclassEX5extendsJFrame{privateContainercontainer;privateGridBagLayoutlayout;privateGridBagConstraintsconstraints;privateJTextFielddisplayField;//计算结果显示区publicEX5(){//构造方法,定义所有课后答案网GUI组件super("Counter");container=getContentPane();layout=newGridBagLayout();container.setLayout(layout);constraints=newGridBagConstraints();displayField=newJTextField(20);www.hackshp.cndisplayField.setHorizontalAlignment(JTextField.RIGHT);constraints.gridx=0;constraints.gridy=0;constraints.gridwidth=4;constraints.gridheight=1;constraints.fill=GridBagConstraints.BOTH;constraints.weightx=100;constraints.weighty=100;layout.setConstraints(displayField,constraints);container.add(displayField);addButton("Backspace",0,1,2,1);addButton("CE",2,1,1,1);addButton("C",3,1,1,1);addButton("7",0,2,1,1);addButton("8",1,2,1,1);addButton("9",2,2,1,1);若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cnaddButton("/",3,2,1,1);addButton("4",0,3,1,1);addButton("5",1,3,1,1);addButton("6",2,3,1,1);addButton("*",3,3,1,1);addButton("1",0,4,1,1);addButton("2",1,4,1,1);addButton("3",2,4,1,1);addButton("-",3,4,1,1);addButton("0",0,5,1,1);addButton("/-",1,5,1,1);addButton(".",2,5,1,1);addButton("",3,5,1,1);addButton("=",0,6,4,1);setSize(300,300);setVisible(true);}privatevoidaddButton(Stringlabel,introw,intcolumn,intwith,intheight){//定义按钮JButtonbutton=newJButton(label);constraints.gridx=row;constraints.gridy=column;constraints.gridwidth=with;constraints.gridheight=height;constraints.fill=GridBagConstraints.BOTH;layout.setConstraints(button,constraints);container.add(button);}publicstaticvoidmain(String[]args){//主程序EX5Counter=newEX5();Counter.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}}课后答案网6.编写一个Java程序FileMenu.java,设计一个简易文件管理菜单。菜单有文件、编辑和帮助3项。其中文件菜单项有以下子菜单项:新建、打开、关闭、退出;编辑菜单项有以下菜单项;复制、粘贴、查找、替换、定位;帮助菜单项有以下子菜单项:拥护帮助、版本说明,采用windows操作系统的外观。www.hackshp.cn【答】:FileMenu.java的源程序清单见下列代码:packagejavabook.answer.ch08;importjavax.swing.*;publicclassEX6extendsJFrame{publicEX6(){super("文件简易菜单");defineMenu();setJMenuBar(menuBar);setVisible(true);setSize(400,300);}若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cnprivatevoiddefineMenu(){menuBar=newJMenuBar();menuBar.setToolTipText("FMS文件处理系统1.0");fileMenu=newJMenu("文件(F)");//定义文件菜单fileMenu.setMnemonic("F");newItem=newJMenuItem("新建");openItem=newJMenuItem("打开");closeItem=newJMenuItem("关闭");exitItem=newJMenuItem("退出");fileMenu.add(newItem);fileMenu.add(openItem);fileMenu.add(closeItem);fileMenu.add(exitItem);editMenu=newJMenu("编辑(E)");editMenu.setMnemonic("E");copyItem=newJMenuItem("复制");pasteItem=newJMenuItem("粘贴");searchItem=newJMenuItem("查找");replaceItem=newJMenuItem("替换");locateItem=newJMenuItem("定位");editMenu.add(copyItem);editMenu.add(pasteItem);editMenu.add(searchItem);editMenu.add(replaceItem);editMenu.add(locateItem);helpMenu=newJMenu("帮助(H)");helpMenu.setMnemonic("H");userHelpItem=newJMenuItem("帮助");versionItem=newJMenuItem("版本");helpMenu.add(userHelpItem);helpMenu.add(versionItem);课后答案网menuBar.add(fileMenu);menuBar.add(editMenu);menuBar.add(helpMenu);}publicstaticvoidmain(Stringargs[]){www.hackshp.cnEX6fm=newEX6();fm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}privateJMenuBarmenuBar;//主菜单条privateJMenufileMenu;//文件菜单privateJMenueditMenu;//编辑菜单privateJMenuhelpMenu;//系统帮助菜单privateJMenuItemnewItem;//文件新建;privateJMenuItemopenItem;//文件打开;privateJMenuItemcloseItem;//文件关闭;privateJMenuItemexitItem;//文件退出;privateJMenuItemcopyItem;//文件复制;privateJMenuItempasteItem;//文件粘贴;若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cnprivateJMenuItemsearchItem;//文件查找;privateJMenuItemreplaceItem;//文件替换;privateJMenuItemlocateItem;//文件定位;privateJMenuItemuserHelpItem;//用户帮助;privateJMenuItemversionItem;//版本说明;}课后答案网www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cn习题九1.什么是代理事件处理模型?请举例说明。【答】:Java语言采用基于代理的事件处理模型。基于代理事件处理模型是引进了监听器接口,每个事件类都有相关联的监听器接口。当用户对GUI组件有所动作,GUI组件会自动产生相应的事件来响应用户的动作。假设这些GUI组件已经注册了相关的监听器对象,监听器对象会一直监听已注册的组件对象是否有事件发生。当监听器对象监听到组件有相对应的事件发生,就会调用监听器对象中方法,即事件处理器来实现一定的动作。就这样,通过对目标监听器对象的相关Java方法调用,实现事件从事件源到监听者的传递。2.常见的事件处理方式有哪几种?请比较各种方式的特点?【答】:有通过(1)实现监听器接口来处理事件、(2)利用独立监听器类实现事件处理、(3)利用内部类实现事件处理、以及(4)利用匿名内部类实现事件处理四种事件处理方式。方法(1)可直接对监听器接口的方法进行处理和调用,并且应用简单方便。但是,这种方式存在一个问题,由于实现接口的方法和定义类的方法处于平行定义,如果要求对多个组件有不同的处理,这种方法无疑会增加阅读程序的困难。方法(2)事件处理的方式优点在于,处理事件的方法清晰明了,可读性强。另外,允许扩展事件适配器(具体内容见8.3节)来定义新的监听器的类,可以减少不需要的方法的处理。但是,在事件发生的主类中,会增加事件发生对监听器对象的方法的额外调用。方法(3)是利用内部类来实现事件处理,具有上述两种方法的优点。但是随着发生事件的组件增多,程序会变得比较庞大,增加对程序的理解。方法(4)是利用匿名内部类实现事件处理。有效减少代码的长度,但是利用匿名内部类更会增加程序阅读的难度。3.编写程序,统计用户在一个窗口点击的次数,并在窗口的状态栏中显示处理。课后答案网【答】:实现窗口状态栏显示点击窗口次数的程序见ClickCounter.java,代码如下:packagejavabook.answer.ch09;importjava.awt.*;importjava.awt.event.*;www.hackshp.cnimportjavax.swing.*;publicclassEX3extendsJFrameimplementsMouseListener{publicEX3(){container=getContentPane();container.setLayout(newBorderLayout());mainFrm=newJPanel();//定义主窗口mainFrm.setSize(400,400);mainFrm.setVisible(true);mainFrm.addMouseListener(this);statuPane=newJPanel();//定义状态栏resultLbl=newJLabel("窗口状态");statuPane.add(resultLbl);container.add(mainFrm,BorderLayout.CENTER);container.add(statuPane,BorderLayout.SOUTH);若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cnsetSize(500,400);setVisible(true);}publicvoidmouseEntered(MouseEvente){}publicvoidmouseExited(MouseEvente){}publicvoidmouseClicked(MouseEvente){//处理点击事件if(e.getSource()==mainFrm){times++;resultLbl.setText("点击次数为:"+times);}}publicvoidmousePressed(MouseEvente){}publicvoidmouseReleased(MouseEvente){}publicstaticvoidmain(Stringargs[]){EX3cc=newEX3();cc.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}JPanelmainFrm;JPanelstatuPane;JLabelresultLbl;Containercontainer;publicinttimes=0;//课后答案网点击次数;}4.编写程序,通过鼠标轮实现对一个圆形的大小控制及通过键盘实现圆形的移动。【答】:实现鼠标对圆形大小和位置的控制见下列代码:packagejavabook.answer.ch09;www.hackshp.cnimportjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassEX4extendsJPanelimplementsKeyListener,MouseWheelListener{Containercontainer;intlength=40;//圆的外接矩形intx=100,y=100;publicEX4(){this.addKeyListener(this);this.addMouseWheelListener(this);this.setFocusable(true);setSize(400,300);setVisible(true);若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cn}publicvoidmouseWheelMoved(MouseWheelEvente){//鼠标移动if(e.getWheelRotation()<0){length-=2;if(length<10)length=10;}elseif(e.getWheelRotation()>0){length+=2;if(length>300)length=300;}repaint();}publicvoidpaintComponent(Graphicsg){//绘制圆形draw(g,x,y,length);}publicvoiddraw(Graphicsg,intx,inty,intlength){g.clearRect(0,0,this.getWidth(),this.getHeight());g.setColor(Color.blue);//设置颜色g.drawOval(x,y,length,length);//绘制圆形;}publicvoidkeyPressed(KeyEvente){intkeycode=e.getKeyCode();if(keycode==KeyEvent.VK_UP){y-=4;if(y<10)y=10;}elseif(keycode==KeyEvent.VK_DOWN){y+=4;课后答案网if(y>400)y=400;}elseif(keycode==KeyEvent.VK_RIGHT){x+=4;if(x>400)x=400;www.hackshp.cn}elseif(keycode==KeyEvent.VK_LEFT){x-=4;if(x<10)x=10;}repaint();}publicvoidkeyTyped(KeyEvente){}publicvoidkeyReleased(KeyEvente){}publicstaticvoidmain(Stringargs[]){//主程序若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cnEX4ms=newEX4();JFramefrm=newJFrame();frm.add(ms);frm.setSize(400,400);frm.setVisible(true);frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}}5.编写程序,实现用户注册的功能。具体包括用户的用户名、密码、确认密码、性别、出生年月。另外设计两个按钮“确认”和“取消”。当用户单击“确认”按钮时,可以将注册信息在屏幕上显示出来。如果单击“取消”,则退出用户注册。【答】:用户注册的程序见下列代码:packagejavabook.answer.ch09;importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;publicclassEX5extendsJFrame{Stringinformation;Stringgendar="",name="",birthday="",password="";JLabelnameLabel,passwordLabel,gendarLabel,confirmLabel,birthLabel;JTextFieldnameField,birthField;JPasswordFieldpasswordField;JPasswordFieldconfirmField;JRadioButtonradio1,radio2;ButtonGroupgroup;JButtonconfirmBtn,cancelBtn;booleanjudge=false;publicEX5(){课后答案网super("用户注册示例");Containercontainer=getContentPane();container.setLayout(newFlowLayout());nameLabel=newJLabel("用户名");nameField=newJTextField(10);nameField.addActionListener(newNewActionListener());container.add(nameLabel);www.hackshp.cncontainer.add(nameField);passwordLabel=newJLabel("密码");passwordField=newJPasswordField(10);confirmLabel=newJLabel("确定密码");confirmField=newJPasswordField(10);passwordField.addActionListener(newNewActionListener());confirmField.addActionListener(newNewActionListener());container.add(passwordLabel);container.add(passwordField);container.add(confirmLabel);container.add(confirmField);若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cnbirthLabel=newJLabel("出生日期");birthField=newJTextField(10);container.add(birthLabel);container.add(birthField);birthField.addActionListener(newNewActionListener());gendarLabel=newJLabel("性别");radio1=newJRadioButton("男");radio2=newJRadioButton("女");radio1.addItemListener(newRadioListener());radio2.addItemListener(newRadioListener());group=newButtonGroup();group.add(radio1);group.add(radio2);container.add(gendarLabel);container.add(radio1);container.add(radio2);confirmBtn=newJButton("确定");cancelBtn=newJButton("取消");confirmBtn.addActionListener(newNewActionListener());cancelBtn.addActionListener(newNewActionListener());container.add(confirmBtn);container.add(cancelBtn);setSize(480,140);setVisible(true);}classRadioListenerimplementsItemListener{//针对单选按钮的事件处理@SuppressWarnings("deprecation")publicvoiditemStateChanged(ItemEvente){课后答案网Objectitem=e.getItemSelectable();if(item==radio1)gendar=radio1.getLabel();elseif(item==radio2)gendar=radio2.getLabel();}www.hackshp.cn}classNewActionListenerimplementsActionListener{@SuppressWarnings("deprecation")publicvoidactionPerformed(ActionEvente){if(e.getSource()==confirmBtn){if(judge)information="姓名"+name+"n密码"+password+"n性别:"+gendar+"n出生日期:"+birthday;elseinformation="密码与确认密码不一致!";JOptionPane.showMessageDialog(null,information);}elseif(e.getSource()==nameField){name=nameField.getText();}elseif(e.getSource()==passwordField){password=passwordField.getText();}elseif(e.getSource()==confirmField){若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cnStringconPassword=confirmField.getText();if(conPassword.equals(password)){judge=true;}}elseif(e.getSource()==birthField){birthday=birthField.getText();}elseif(e.getSource()==cancelBtn){System.exit(0);}}}publicstaticvoidmain(Stringargs[]){EX5re=newEX5();re.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}}6.编写程序实现菜单的制作并根据菜单项执行相应的处理。该菜单包括“格式”和“窗口”两项,其中“格式”菜单可以设置前景色、背景色、字体的风格、指定字体格式等内容。【答】:实现相应功能的程序见下列代码:packagejavabook.answer.ch09;importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassEX6extendsJFrameimplementsActionListener,ItemListener{JScrollPanescrollPane;JTextAreaoutput;StringcolorNames[]={"红色","兰色","绿色","灰色","白色","黑色"};Colorcolor[]={Color.red,Color.blue,Color.green,Color.gray,课后答案网Color.white,Color.black};StringfontStyleNames[]={"粗体","斜体"};StringfontNames[]={"楷体","宋体","黑体","Serif","TimesNewRoman"};intfontstyle=Font.PLAIN;intfontbold,fontitalic;Stringfontname="TimesNewRoman";www.hackshp.cnintfontsize=20;JMenuItemcolorItems[],bcolorItems[];ButtonGroupbuttonGroup;JCheckBoxMenuItemfontStyleItem[];JRadioButtonMenuItemfontItem[];JMenuItemcloseItem;publicEX6(){//constructorsuper("MenuTest");ImageIconicon=newImageIcon("D:/javaexample/games.gif");setIconImage(icon.getImage());createAndShowGUI();}publicJMenuBarcreateMenuBar(){//createamenu若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cnJMenuBarstyleMenuBar;styleMenuBar=newJMenuBar();//菜单条JMenustyleMenu=newJMenu("格式");//菜单;JMenuforegroundItem=newJMenu("前景色");//建立下拉菜单colorItems=newJMenuItem[colorNames.length];for(inti=0;i"u0039")throw(newTypeConversionException(String.valueOf(tempC)));else若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cntempInt=tempInt*10+(tempC-48);}}returntempInt;}}/***数据类型转换异常*/classTypeConversionExceptionextendsException{publicTypeConversionException(){super("数据类型转换错误");}publicTypeConversionException(Stringarg0){super(arg0+"发生转换错误");}}publicclassEX7{publicstaticvoidmain(String[]args){StringtestStr;try{testStr="1234556";System.out.println(TypeConversion.String2Int(testStr));testStr="abc";System.out.println(TypeConversion.String2Int(testStr));}catch(TypeConversionExceptiontce){System.out.println(tce.toString());}}}课后答案网8.试述throw语句与throws关键字之间的功能差异。【答】:throw语句用来明确的抛出一个“异常”;throws用来标明一个成员函数可能抛出的各种异常。www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cn习题十一1.Java为什么要引入线程机制?线程与进程之间有什么联系和区别?【答】:1)现实世界中很多过程都具有多条线索同时工作的特点,这就需要编写的程序也要支持多线程的工作。2)在Java程序中引入线程机制可以提高CPU的利用率,增加程序的吞吐量。进程是程序的一次动态执行过程,它对应了从代码加载、执行到执行完毕的一个完整过程;线程是比进程更小的执行单位。一个进程在其执行过程中,可以产生多个线程,形成多条执行线索;每个进程都有一段专用的内存区域,并以PCB作为它存在的标志,与此不同的是,线程间可以共享相同的内存单元,并利用这些共享单位来实现数据交换、实时通信与必要的同步操作。2.线程的基本状态有哪些?试描述它们的相互转换过程。【答】:线程的基本状态有“新建”、“就绪”、“运行”、“阻塞”、“死亡”。转换过程如图:就绪运行新建死亡阻塞3.线程与线程组之间有何关系?【答】:课后答案网线程组是类ThreadGroup的对象,每个线程都隶属于惟一一个线程组,这个线程组在线程创建时指定并在线程的整个生命期内都不能更改;在创建线程时可以通过构造函数指定线程所属的线程组,若不指定,则线程默认属于System线程组;www.hackshp.cnJava允许对一个线程组中的所有线程同时进行操作,可以同时阻塞和启动同一个线程组中的线程。4.创建线程的方式有哪几种?请举例说明。【答】:线程的创建有两种方式。1)利用Thread类或者是Thread类的子类创建线程对象。见例11.12)通过实现Runnable接口创建线程对象。见例11.55.线程的终止与线程的挂起有何不同?试编写一个Applet说明线程的终止与线程的挂起。若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cn【答】:线程的终止指线程不再具有运行的能力。线程终止的原因有2个:一个是正常运行的线程完成了它的全部工作,即执行完了run()方法的最后一个语句并退出;另一个是线程被提前强制性的终止。线程的挂起指一个正在执行的线程如果在某些特殊情况下,如被人为挂起或需要执行费时的输入输出操作时,将让出CPU并暂时中止自己的执行,进入阻塞状态。当满足这个线程继续执行的条件后,该线程可以自动或人为的恢复就绪状态等待执行。下面一个JavaApplet程序用来表示时间的显示,设计了表示线程挂起的方法,挂起的线程可以恢复,而当Applet退出的时候,将线程终止,终止的线程无法恢复。packagejavabook.answer.ch11;importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;importjava.text.*;importjava.util.*;/***数字时钟面板**/classTimePanelextendsJPanelimplementsRunnable{privatevolatileThreadtimer;//用来显示时间的子线程privateSimpleDateFormatformatter;//用于格式化显示的时间privateStringlastdate;//用于显示时间的字符串privateDatecurrentDate;//时间对象privatebooleansuspended;//是否挂起时间publicTimePanel(){this.start();}课后答案网publicvoidpaint(Graphicsg){//paint方法super.paint(g);Fontfont=newFont("TimesNewRoman",Font.BOLD,50);g.setFont(font);currentDate=newDate();www.hackshp.cnformatter=newSimpleDateFormat("HH:mm:ss");lastdate=formatter.format(currentDate);g.drawString(lastdate,5,50);currentDate=null;}publicvoidstart(){//时钟线程的启动timer=newThread(this);timer.start();}publicvoidstop(){//时钟线程的终止timer=null;}publicvoidrun(){//时钟线程的操作Threadme=Thread.currentThread();while(timer==me){try{Thread.sleep(1000);若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cnwaitIfSuspended();}catch(InterruptedExceptione){}repaint();//休眠一段时间后重绘窗体}}publicsynchronizedvoidsuspend(){//时钟线程的挂起suspended=true;}publicsynchronizedvoidresume(){//时钟线程的恢复if(suspended){suspended=false;notifyAll();}}privatesynchronizedvoidwaitIfSuspended()throwsInterruptedException{while(suspended)wait();}}publicclassEX5extendsJApplet{privateTimePaneltime;privateJButtonjbtSuspend,jbtResume;publicEX5(){time=newTimePanel();jbtSuspend=newJButton("挂起");jbtResume=newJButton("恢复");jbtSuspend.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){time.suspend();}});jbtResume.addActionListener(课后答案网newActionListener(){publicvoidactionPerformed(ActionEvente){time.resume();}});JPanelbtPanel=newJPanel();btPanel.add(jbtSuspend);www.hackshp.cnbtPanel.add(jbtResume);this.getContentPane().add(time,BorderLayout.CENTER);this.getContentPane().add(btPanel,BorderLayout.SOUTH);}}6.试说明线程优先级及其调度的关系,并编写一个Applet说明其关系。【答】:在线程排队时,优先级高的线程可以排在较前的位置,能优先享用到处理器资源;而优先级较低的线程则只能等到排在它前面的高优先级线程执行完毕之后才能获得处理器资源。对于优先极相同的线程,则遵循队列的“先进先出”的原则,即先进入就绪状态排队的线程被优先分配到处理器资源,随后才为后进入队列的线程服务。下列程序显示了线程优先级和调度的关系:若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cnpackagejavabook.answer.ch11;publicclassEX6{publicstaticvoidmain(Stringargs[]){Threadprintnum10=newThread(newPrintNum("c",10));Threadprintnum50=newThread(newPrintNum("a",50));Threadprintnum100=newThread(newPrintNum("b",100));printnum50.setPriority(Thread.MAX_PRIORITY);printnum10.setPriority(Thread.MIN_PRIORITY);printnum100.start();printnum50.start();printnum10.start();}}classPrintNumimplementsRunnable{privateintlastNum;privateStringname;publicPrintNum(StringinitName,intinitLastNum){name=initName;lastNum=initLastNum;}publicvoidrun(){for(inti=1;i<=lastNum;i++)System.out.println(name+":"+i);}}7.利用Executor接口或者其子接口改写例课后答案网11.4【答】:packagejavabook.answer.ch11;importjava.util.*;importjava.util.concurrent.*;www.hackshp.cn/***时间打印线程*/classTimePrinterimplementsRunnable{//定义了实现了Runnable接口的子类TimePrinter类intpauseTime;Stringname;publicTimePrinter(intx,Stringn){//构造函数pauseTime=x;name=n;}publicvoidrun(){//用户重载了run()方法,定义了线程的任务while(true){try{System.out.println(name+":"+newDate(System.currentTimeMillis()));Thread.sleep(pauseTime);若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cn}catch(Exceptione){//有可能抛出线程休眠被中断异常System.out.println(e);}}}}publicclassEX7{publicstaticvoidmain(Stringargs[]){ExecutorServiceexecutor=Executors.newFixedThreadPool(4);executor.execute(newTimePrinter(1000,"FastGuy"));executor.execute(newTimePrinter(3000,"SlowGuy"));}}8.什么是临界区?线程进入临界区的调度原则是什么?【答】:临界区:为了避免资源冲突,应该防止多个线程同时进入程序的某个特定部分,这个特定部门就是临界区。线程通过给临界区加锁的机制进入临界区,一个临界区只能有一把锁,当某个线程获得这把锁以后,将阻塞其他线程进入临界区,直到改线程释放这把锁。在Java中,通过wait(),notify(),notifyAll()来实现线程间协作。其中wait()方法用来暂停线程,并释放其对临界区的锁定,notify()和notifyAll()方法激活处于等待中的线程。9.Java语言如何定义临界区?试编写一个Applet说明之。【答】:在Java中,利用锁机制的实现临界区,在临界区代码之前加入synchronized段,把共享代码包含在synchronized段中,格式如下:synchronized[(objectname)]statement课后答案网测试代码如下:packagejavabook.answer.ch11;importjavax.swing.*;importjava.awt.*;www.hackshp.cnpublicclassEX9extendsJApplet{privatesumAddsum1;privatesumAddsum2;publicvoidinit(){sum1=newsumAdd();sum2=newsumAdd();ThreadGroupg=newThreadGroup("g");for(inti=0;i<100;i++){newThread(g,newsumAddThreadWithSync()).start();newThread(g,newsumAddThreadWithoutSync()).start();}booleancanStop=false;while(!canStop){if(g.activeCount()==0)canStop=true;}若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cn}publicvoidpaint(Graphicsg){super.paint(g);g.drawString("同步线程操作,加法结果:"+sum1.getSum(),10,20);g.drawString("不同步线程操作,加法结果:"+sum2.getSum(),10,40);}/***计数类*/classsumAdd{intsum;publicsumAdd(){sum=0;}publicintgetSum(){returnsum;}publicsynchronizedvoidaddWithSync(){//对加1操作加锁inttemp=sum;try{Thread.sleep(10);}catch(InterruptedExceptione){}temp=temp+1;sum=temp;}publicvoidaddWithoutSync(){//对加1操作没有加锁inttemp=sum;try{Thread.sleep(10);}catch(InterruptedExceptione){}课后答案网temp=temp+1;sum=temp;}}/**www.hackshp.cn*计数线程*/classsumAddThreadWithSyncextendsThread{publicvoidrun(){sum1.addWithSync();}}classsumAddThreadWithoutSyncextendsThread{publicvoidrun(){sum2.addWithoutSync();}}}说明:设计了2种线程做加1操作,一个线程使用对临界区加锁方式,另一个没有加锁,结果各启动了100个线程,结果显示如下,表明加锁的线程得到正确的结果。若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cn10.试用Java语言编写操作系统中的读者/作者问题的Applet程序,允许多个读者同时读文件,但只允许一个作者写文件。【答】:packagejavabook.answer.ch11;classDatabase{privatestaticfinalintNAP_TIME=5;privateintreaderCount;privateintwriterCount;privatebooleandbReading;privatebooleandbWriting;publicDatabase(){readerCount=0;writerCount=0;dbReading=false;课后答案网dbWriting=false;}publicstaticvoidnapping(){intsleepTime=(int)(NAP_TIME*Math.random());try{www.hackshp.cnThread.sleep(sleepTime*1000);}catch(Exceptione){e.printStackTrace();}}publicsynchronizedintstartRead(){while(writerCount>0){try{System.out.println("readeriswaiting");wait();}catch(Exceptione){System.out.println(e.toString());e.printStackTrace();}}若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cn++readerCount;if(readerCount==1){dbReading=true;}returnreaderCount;}publicsynchronizedintendReading(){--readerCount;if(readerCount==0){dbReading=false;}notifyAll();System.out.println("onereaderisdonereading.Count="+readerCount);returnreaderCount;}publicsynchronizedvoidstartWriting(){++writerCount;while(dbReading==true||dbWriting==true){try{System.out.println("Writeriswaiting");wait();}catch(Exceptione){System.out.println(e.toString());}}dbWriting=true;}publicsynchronizedvoidendWriting(){--writerCount;dbWriting=false;System.out.println("onewriterisdonewriting.Count="+writerCount);课后答案网notifyAll();}}classReaderextendsThread{www.hackshp.cnprivateDatabaseserver;privateintreaderNum;publicReader(intr,Databasedb){super();readerNum=r;server=db;}publicvoidrun(){intc;while(true){System.out.println("reader"+readerNum+"issleeping");Database.napping();System.out.println("reader"+readerNum+"wantstoread");c=server.startRead();System.out.println("reader"+readerNum+"isreading.Count="若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cn+c);Database.napping();c=server.endReading();System.out.println("Itisreader"+readerNum+"whohasdonereadingaccordingtocount="+c);}}}classWriterextendsThread{privateDatabaseserver;privateintwriterNum;publicWriter(intw,Databasedb){super();writerNum=w;server=db;}publicvoidrun(){while(true){System.out.println("Writer"+writerNum+"issleeping");Database.napping();System.out.println("Writer"+writerNum+"wantstowrite");server.startWriting();System.out.println("Writer"+writerNum+"iswriting");Database.napping();server.endWriting();System.out.println("ItisWriter"+writerNum+"whohasdonewriting.");}}}publicclassEX10{课后答案网publicstaticvoidmain(String[]args){Databasedb=newDatabase();Readerr1=newReader(1,db);Readerr2=newReader(2,db);Readerr3=newReader(3,db);www.hackshp.cnReaderr4=newReader(4,db);Writerw1=newWriter(1,db);Writerw2=newWriter(2,db);r1.start();r2.start();r3.start();w1.start();r4.start();w2.start();}}11.假定一个阅览室最多可容纳100人,读者进入和离开阅览室时都必须在阅览室门口的登记表上作标志(进入时登记,离开时去掉登记项),而且每次只允许一人登记或去掉登记。若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cn试编写线程同步通信关系。【答】:见如下程序:packagejavabook.answer.ch11;publicclassEX11{Librarylib=newLibrary();publicEX11(){for(inti=1;i<=200;i++){(newReader(i)).start();}}publicstaticvoidmain(String[]args){EX11exe=newEX11();}//图书馆类classLibrary{privateintreaderCount;booleanbusy;publicLibrary(){readerCount=0;busy=false;}publicintgetReaderCout(){returnreaderCount;}publicsynchronized课后答案网voidcheckIn(intreaderNum){while(busy||readerCount>=100){try{System.out.println("Reader"+readerNum+"iswaitingtocheckin");wait();}catch(InterruptedExceptione){}}www.hackshp.cnbusy=true;++readerCount;busy=false;notifyAll();}publicsynchronizedvoidcheckOut(intreaderNum){while(busy){try{System.out.println("Reader"+readerNum+"iswaitingtocheckout");wait();}catch(InterruptedExceptione){}}busy=true;--readerCount;busy=false;notifyAll();若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cn}publicvoidread(intreaderNum){try{System.out.println("Reader"+readerNum+"isreading,count="+readerCount);Thread.sleep((long)(5000));}catch(InterruptedExceptione){}}}classReaderextendsThread{privateintreaderNum;publicReader(intinitNum){readerNum=initNum;}publicvoidrun(){System.out.println("Reader"+readerNum+"entersLibrary,cout="+lib.getReaderCout());try{Thread.sleep((long)(Math.random()*5000));}catch(InterruptedExceptione){}lib.checkIn(readerNum);System.out.println("Reader"+readerNum+"startsreading,cout="+lib.getReaderCout());try{Thread.sleep((long)(Math.random()*10000));}catch(InterruptedExceptione){}lib.read(readerNum);System.out.println("Reader"+readerNum+"endsreading,cout="+lib.getReaderCout());try{Thread.sleep((long)(Math.random()*10000));}catch(InterruptedExceptione){}lib.checkOut(readerNum);System.out.println("Reader"+readerNum+"leavesLibrary,cout="+lib.getReaderCout());}课后答案网}}12.什么是死锁?在多线程程序设计中如何防止死锁?【答】:www.hackshp.cn死锁是指两个或多个线程无休止地互相等待对方释放所占据资源的过程。错误的同步往往会引起死锁。为了防止死锁,可以使用资源排序的方法,给每个需要锁定的对象定义一个顺序,确保每个线程都按照这个顺序来锁定对象。13.实验1)编写程序,在Applet中生成一个蓝色的反弹球。该球应用一个mousePressed事件初始化。当球碰到Applet边框时,它应该被弹起并沿反方向运动。2)修改上面的程序,允许用户每点击一次鼠标就增加一个新球。提供至少20个球。为每个球随机选择颜色。【答】:该实验的程序代码如下:若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cnpackagejavabook.answer.ch11;importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassEX13extendsJApplet{publicEX13(){this.getContentPane().add(newBallJumpPan());课后答案网}/***@authorJavaBookAnswer**球类www.hackshp.cn*/classBall{intxb,yb;intvx,vy;booleanstate=true;finalintW=5,H=5;Colorcolor;publicBall(intx,inty){xb=x;yb=y;vx=-(int)(Math.random()*10+5);vy=-(int)(Math.random()*10+5);color=newColor((int)(Math.random()*255),(int)(Math.random()*255),(int)(Math.random()*255));}若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cn}/***@authorJavaBookAnswer**跳动球Panel**/publicclassBallJumpPanextendsJPanelimplementsRunnable,MouseListener{Ball[]ball;ThreadballThread;inttime,count;intmv=30;publicBallJumpPan(){this.addMouseListener(this);setSize(400,300);setBackground(Color.black);time=50;count=0;ball=newBall[20];ballThread=newThread(this);ballThread.start();}publicvoidpaint(Graphicsg){super.paint(g);for(inti=0;i380||ball[i].xb<0){ball[i].vx=-ball[i].vx;}www.hackshp.cnif(ball[i].yb<0||ball[i].yb>280){ball[i].vy=-ball[i].vy;}ball[i].xb+=ball[i].vx;ball[i].yb+=ball[i].vy;}try{Thread.sleep(time);}catch(InterruptedExceptione){}}}publicvoidmouseClicked(MouseEventarg0){}若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cnpublicvoidmouseEntered(MouseEventarg0){}publicvoidmouseExited(MouseEventarg0){}publicvoidmousePressed(MouseEventarg0){if(count<20){ball[count++]=newBall(200,150);}}publicvoidmouseReleased(MouseEventarg0){}}}课后答案网www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cn习题十二1.什么是流?流式输入输出的最大的特点是什么?【答】:所谓流是指同一台计算机或网络中不同计算机之间有序运动着的数据序列,Java把这些不同来源和目标的数据都统一抽象为数据流。数据流可分为输入流和输出流,输入流代表从其他设备流入计算机的数据序列,输出流代表从计算机流向外部设备的数据序列。流式输入输出的特点是数据的获取和发送沿数据序列的顺序进行,即每一个数据都必须等待排在它前面的数据,等前面的数据读入或送出之后才能被读写。所以流和队列一样,只能以“先进先出”的方式对其中的数据进行读写,而不能随意选择读写的位置。2.Java的基本输入输出流有哪些?它们的主要功能如何?【答】:java的基本输入输出流是包括:java.io包中的流类(java.io.InputStream及java.io.OutputStream的各个子类)、java的3个内置标准流对象(标准输入流System.in、标准输出流System.out、标准出错流System.err。)其中java.io包中的流类使用相应方法从指定媒体读取数据或向指定媒体写入数据。内置标准流对象用来实现标准输入输出(即读取用户从键盘的输入或在屏幕上显示信息)和标准错误输出。3.利用基本输入输出流编写下面的程序:从键盘读入一个字符,然后让它屏幕回显。【答】:代码如下:importjava.io.*;publicclassCharRead{publicstaticvoidmain(Stringargs[]){charc;try{课后答案网c=(char)System.in.read();}Catch(IOExceptione){}System.out.println(c);}}www.hackshp.cn4.与基本输入输出流相比,数据输入输出流有什么特别的功能?【答】:基本输入输出流主要是对文本形式的数据进行读写,也可以将本文形式的数据转换成Java中的数据类型,而本身是二进制类型的数据。数据流可以通过分别实现了DataOutput和DataInput两个接口的DataOutputStream和DataInputStream类中的方法对Java的基本类型数据进行读写。它实际是按照Java各种数据类型的字节数读入和写出若干字节,然后组装成相应类型的数据。5.文件按组织结构可分为哪几类,分别是什么?在Java中提供了什么类库处理每一类文件?【答】:根据数据的组织形式,可将文件分为文本文件和二进制文件。文本文件中,每个字节存若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cn放一个ASCII码,代表一个字符。二进制文件中,数据按其在内存中的存储形式原样输出到磁盘文件中存放。在Java的I/O库中,抽象类Reader和Writer只能用来对文本文件进行操作,而抽象类InputStream和OutputStream可以对文本文件或二进制文件进行操作。6.程序和磁盘文件交互数据之前应该先完成什么操作?【答】:首先应该创建与源文件或目标文件连接好的流对象。7.什么情况下创建FileInputStream对象可能引发IOException?什么情况下创建FileOutputStream对象可能破坏文件?【答】:当你创建一个输入流而文件不存在时,引发FileNotFoundException异常,使用FileInputStream的reset()会生成IOException异常。对于输出流,如果文件不能生成,则引发FileNotFoundException异常,打开一个只读文件,会引发一个IOException异常。如果一个输出文件被打开,所有原先存在的同名的文件被破坏。8.书写语句完成下列要求:1)在当前目录下创建一个名为Myfile.txt的文件,但暂时不向里面输入数据。2)向DataOutputStream对象dos的当前位置处书写一个保存在变量score中的浮点数。3)向DataOutputStream对象dos的当前位置处书写一个保存在变量stuid中的整数。4)从DataInputStream对象dis的当前位置处读取一个浮点数保存在变量score中。5)从DataInputStream对象dis的当前位置处读取一个整数保存在变量stuid中。【答】:1)Filemyfile=newFlie(“D:\xxx\Myfile.txt”);2)DataOutputStreamdos=newDataOutputStream(“D:\xxx\Myfile.text”);dos.writeDouble(score);3)dos.writeInt(stuid);课后答案网4)DataInputStreamdis=newDataInputStream(“D:\xxx\Myfile.text”);score=dis.readDouble();5)stuid=dis.readInt();9.编写一个JavaApplication程序,包括一个TextField和一个按钮,请用户输入若干字符串,保存在文件myfile.txt里。www.hackshp.cn【答】:packagejavabook.answer.ch12;importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;importjava.io.*;publicclassEX9extendsJFrameimplementsActionListener{privateJTextFieldtxt;privateJButtonb;publicEX9(Stringss){super(ss);txt=newJTextField("请在此输入:",20);b=newJButton("保存到文件");若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cnb.addActionListener(this);this.getContentPane().add(txt,BorderLayout.CENTER);this.getContentPane().add(b,BorderLayout.SOUTH);this.pack();this.setVisible(true);}publicvoidactionPerformed(ActionEvente){Strings=txt.getText();try{FileWriterfw=newFileWriter("D:\mydata.txt");PrintWriterout=newPrintWriter(fw);out.println(s);out.close();fw.close();}catch(IOExceptione2){System.out.println("GetanIOException");e2.printStackTrace();}}publicstaticvoidmain(String[]args){EX9fm=newEX9("习题9");fm.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});}}10.实验1)编写一个JavaApplication程序,包括一个“选定文件”按钮和一个TextArea,用户点击按钮时将弹出FileDialog,请用户在其中选择一个文本文件,然后关闭课后答案网FileDialog,程序将把这个文本文件的内容显示在TextArea中。2)编写一个图形界面的JavaApplication程序,包括分别用于输入字符串的浮点数的两个TextField,以及两个按钮和一个TextArea。用户在两个TextArea中输入数据,按“输入”按钮,程序则将这两个数据保存入一个文件file.dat中;按“输出”按钮,则将这个文件的内容读出来。www.hackshp.cn【答】:1)JavaApplication程序代码:packagejavabook.answer.ch12;importjava.awt.*;importjava.awt.event.*;importjava.io.*;importjavax.swing.*;publicclassEX10aextendsJFrameimplementsActionListener{privateJTextAreadisplay;privateJButtonb;privateJFileChooserjFileChooser1;publicEX10a(){若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cnsuper("文件查看器");display=newJTextArea();b=newJButton("选择文件");b.addActionListener(this);this.getContentPane().add(b,BorderLayout.NORTH);this.getContentPane().add(display,BorderLayout.CENTER);setSize(300,300);this.setVisible(true);}publicvoidactionPerformed(ActionEvente){jFileChooser1=newJFileChooser(newFile("."));if(jFileChooser1.showOpenDialog(this)==JFileChooser.APPROVE_OPTION){try{FilereadFile=jFileChooser1.getSelectedFile();BufferedReaderout=newBufferedReader(newFileReader(readFile));StringBufferbuffer=newStringBuffer();Stringtext;while((text=out.readLine())!=null){buffer.append(text+"n");}out.close();display.setText(buffer.toString());}catch(IOExceptionioe){display.setText(ioe.toString());}}}publicstaticvoidmain(String[]args){EX10afv=newEX10a();fv.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}课后答案网});}}1)JavaApplication程序代码:packagejavabook.answer.ch12;www.hackshp.cnimportjava.awt.*;importjava.awt.event.*;importjavax.swing.*;importjava.io.*;publicclassEX10bextendsJFrame{privateJTextFieldjtfStr,jtfDouble;privateJButtonjbtWrite,jbtRead;privateJTextAreajtaText;privateFilefile=newFile("D:\file.dat");publicEX10b(Stringss){super(ss);jtfStr=newJTextField("请在此输入字符串:",20);若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cnjtfDouble=newJTextField("请在此输入浮点数",20);jbtWrite=newJButton("输入");jbtRead=newJButton("输出");jtaText=newJTextArea(5,20);jbtWrite.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventarg0){writeToFile();}});jbtRead.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventarg0){readFromFile();}});JPanelpanel1=newJPanel();panel1.setLayout(newGridLayout(2,1,10,10));panel1.add(jtfStr);panel1.add(jtfDouble);JPanelpanel2=newJPanel();panel2.setLayout(newGridLayout(1,2,10,10));panel2.add(jbtWrite);panel2.add(jbtRead);this.getContentPane().add(panel1,BorderLayout.NORTH);this.getContentPane().add(panel2,BorderLayout.CENTER);this.getContentPane().add(jtaText,BorderLayout.SOUTH);this.pack();this.setVisible(true);}privatevoidwriteToFile(){try{Stringtext=jtfStr.getText();doubled=Double.parseDouble(jtfDouble.getText());FileWriterfw=课后答案网newFileWriter(file);PrintWriterout=newPrintWriter(fw);out.println(text+"n"+d);out.close();fw.close();}catch(NumberFormatExceptionnfe){JOptionPane.showMessageDialogwww.hackshp.cn(this,"浮点数输入错误");}catch(IOExceptione2){JOptionPane.showMessageDialog(this,"写入文件失败");}}privatevoidreadFromFile(){try{StringtempText;FileReaderfr=newFileReader(file);BufferedReaderbr=newBufferedReader(fr);jtaText.setText("");while((tempText=br.readLine())!=null){jtaText.append(tempText+"n");}}catch(IOExceptione3){JOptionPane.showMessageDialog(this,"读取文件失败");}若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cn}publicstaticvoidmain(String[]args){EX10bfrw=newEX10b("文件读写");frw.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});}}课后答案网www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cn习题十三1.编写一个JavaApplet程序,要求其实现一个半径为15个像素点的圆在Applet中从左到右、从右到左的循环移动。【答】:代码如下:packagejavabook.answer.ch13;importjava.awt.*;importjavax.swing.*;publicclassEX1extendsJApplet{publicEX1(){this.getContentPane().add(newBallPane());}publicclassBallPaneextendsJPanelimplementsRunnable{intballX,ballY,radius;intvx;intwidth,height;publicBallPane(){ballX=0;ballY=100;radius=15;vx=-10;width=400;height=200;this.setSize(width,height);newThread(this课后答案网).start();}publicvoidpaint(Graphicsg){super.paint(g);if(ballX<=0||ballX>=width-30){vx=-vx;www.hackshp.cn}ballX+=vx;g.setColor(Color.RED);g.fillOval(ballX,ballY,2*radius,2*radius);}publicvoidrun(){while(true){repaint();try{Thread.sleep(200);}catch(InterruptedExceptione){}若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cn}}}}2.编写一个JavaApplet程序,要求其实现播放声音文件(假设此声音文件与Java源代码文件在同一个文件夹中)。【答】:播放中华人民共和国国歌,(注意:需要资源文件china.wav)packagejavabook.answer.ch13;importjavax.swing.*;importjava.applet.*;importjava.net.*;publicclassEX2extendsJApplet{publicEX2(){ClassmetaObject=this.getClass();//需要将china.wav文件复制进入当前类的class文件所在文件夹URLurl=metaObject.getResource("china.wav");AudioClipaudio=Applet.newAudioClip(url);audio.play();}}3.编写一个JavaApplet程序,要求其实现字符串“HELLO”在页面正中央从小到大,从大到小循环扩散、缩小,颜色随机变化。【答】:课后答案网packagejavabook.answer.ch13;importjava.awt.*;importjavax.swing.*;www.hackshp.cnpublicclassEX3extendsJApplet{publicEX3(){this.setSize(400,300);this.getContentPane().add(newStringZoomPane());}publicclassStringZoomPaneextendsJPanelimplementsRunnable{intfontSize;intvx;publicStringZoomPane(){fontSize=20;vx=2;若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cnthis.setSize(400,300);newThread(this).start();}publicvoidpaint(Graphicsg){super.paint(g);if(fontSize<=5||fontSize>=100){vx=-vx;}fontSize+=vx;Colorcolor=newColor((int)(Math.random()*255),(int)(Math.random()*255),(int)(Math.random()*255));g.setColor(color);Fontf=newFont("TimesNewRoman",Font.BOLD,fontSize);g.setFont(f);FontMetricsfm=g.getFontMetrics();intwidth=fm.stringWidth("HELL)");intascent=fm.getAscent();intx=(this.getWidth()-width)/2;inty=(this.getHeight()-ascent)/2;g.drawString("HELLO",x,y);}publicvoidrun(){while(true){repaint();try{Thread.sleep(200);}catch(InterruptedExceptione){}}}课后答案网}}4.Frame上有一个“选择文件”按钮,按下后出现文件对话框,用户选择视频文件后,利用JMF播放该视频。www.hackshp.cn【答】:代码如下:注意:在使用JMF播放视频前,首先需要下载并正确安装JMF工具。packagejavabook.answer.ch13;importjava.awt.*;importjava.awt.event.*;importjava.io.*;importjavax.swing.*;importjavax.media.*;publicclassEX4extendsJFrame{若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cnprivatePlayerPaneplayerPane;privateJPanelbtPane;privateJButtonbtLoadAndPlay;publicEX4(){playerPane=newPlayerPane();btPane=newJPanel();btLoadAndPlay=newJButton("选择文件");btLoadAndPlay.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventarg0){JFileChooserjfChooser=newJFileChooser(newFile("."));if(jfChooser.showOpenDialog(btPane)==JFileChooser.APPROVE_OPTION){FilereadFile=jfChooser.getSelectedFile();StringfileUrl=readFile.getAbsolutePath();playerPane.playerLoad(fileUrl);}}});btPane.add(btLoadAndPlay);this.getContentPane().add(playerPane,BorderLayout.NORTH);this.getContentPane().add(btPane,BorderLayout.CENTER);}publicstaticvoidmain(Stringargs[]){EX4ex4=newEX4();ex4.setSize(400,300);ex4.setVisible(true);ex4.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}classPlayerPaneextendsJPanel{privatePlayerplayer;课后答案网privateComponentvc;publicPlayerPane(){super();}www.hackshp.cnpublicvoidplayerLoad(StringmediaUrl){try{player=Manager.createPlayer(newMediaLocator(mediaUrl));player.addControllerListener(newControllerListener(){publicvoidcontrollerUpdate(ControllerEvente){playerControl(e);}});player.prefetch();}catch(NoPlayerExceptionnpe){JOptionPane.showMessageDialog(this,"couldnotfindaplayer.");}catch(IOExceptionioe){JOptionPane.showMessageDialog(this,ioe.toString());若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cn}catch(Exceptione){JOptionPane.showMessageDialog(this,"播放器发生错误");}}publicvoidplayerControl(ControllerEventevent){if(eventinstanceofEndOfMediaEvent){player.setMediaTime(newTime(0));player.start();}elseif(eventinstanceofPrefetchCompleteEvent){player.start();}elseif(eventinstanceofRealizeCompleteEvent){vc=player.getVisualComponent();if(vc!=null){add(vc);}pack();setResizable(false);setVisible(true);}}}}5.有若干个面板,第一个面板上按原图大小显示image.gif,第二个面板上按原图宽度、高度均放大一倍显示,第三个面板上按原图宽度、高度均缩小一倍显示,第四个面板上按原图宽度放大一倍、高度不变显示,第五个面板上按原图宽度不变、高度放大一倍显示,用卡片式布局及几个按钮来实现。【答】:课后答案网代码如下:packagejavabook.answer.ch13;importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;www.hackshp.cnimportjava.net.*;publicclassEX5extendsJFrameimplementsActionListener{privateJPanelcardPane,btPane;privateCardLayoutcardLayout;privateCard[]card;privateJButtonjbtFirst,jbtPre,jbtNext,jbtLast;publicEX5(){ClassmetaObject=this.getClass();URLurl=metaObject.getResource("london.gif");card=newCard[5];card[0]=newCard(url,1,1);若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cncard[1]=newCard(url,2,2);card[2]=newCard(url,0.5,0.5);card[3]=newCard(url,2,1);card[4]=newCard(url,1,2);cardPane=newJPanel();cardLayout=newCardLayout();cardPane.setLayout(cardLayout);for(inti=0;i<=4;i++){cardPane.add(String.valueOf(i),card[i]);}jbtFirst=newJButton("First");jbtPre=newJButton("Previous");jbtNext=newJButton("Next");jbtLast=newJButton("Last");jbtFirst.addActionListener(this);jbtPre.addActionListener(this);jbtNext.addActionListener(this);jbtLast.addActionListener(this);btPane=newJPanel();btPane.setLayout(newGridLayout(1,4,10,10));btPane.add(jbtFirst);btPane.add(jbtPre);btPane.add(jbtNext);btPane.add(jbtLast);this.getContentPane().add(cardPane,BorderLayout.CENTER);this.getContentPane().add(btPane,BorderLayout.SOUTH);}publicvoidactionPerformed(ActionEvente){StringactionCommand=e.getActionCommand();CardLayoutcardLayout=(CardLayout)cardPane.getLayout();if(actionCommand.equals("First"))课后答案网cardLayout.first(cardPane);elseif(actionCommand.equals("Previous"))cardLayout.previous(cardPane);elseif(actionCommand.equals("Next"))cardLayout.next(cardPane);elseif(actionCommand.equals("Last"))www.hackshp.cncardLayout.last(cardPane);}publicstaticvoidmain(Stringargs[]){EX5ex5=newEX5();ex5.setSize(400,500);ex5.setVisible(true);ex5.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}classCardextendsJPanel{privatedoublew,h;Imageimg;若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cnpublicCard(URLimgUrl,doubleinitw,doubleinith){img=(newImageIcon(imgUrl)).getImage();w=initw;h=inith;this.setSize(400,400);}publicvoidpaintComponent(Graphicsg){super.paintComponent(g);intwidth=(int)(w*img.getWidth(this));intheight=(int)(h*img.getHeight(this));if(img!=null){g.drawString("London2012,Width:"+width+"Height:"+height,0,20);g.drawImage(img,0,40,width,height,this);}}}}课后答案网www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cn习题十四1.什么是socket?它与TCP/IP协议有什么关系?【答】:Socket可以看成在两个程序进行通信连接中的一个端点,一个程序将一段信息写入Socket中,该Socket将这段信息发送给另外一个Socket中,使这段信息能传送到其他程序中。在两个网络应用程序之间发送和接收信息时都需要建立一个可靠的连接,流套接字依靠TCP协议来保证信息正确到达目的地。2.与TCP/IP协议有关的Java类库有哪些?它们是如何定义的?分别怎样使用?【答】:只要有如下三个类库:InetAddress、Socket和ServerSocket。InetAddress对象描绘了32位或128位IP地址;Socket对象代表了客户程序流套接字;ServerSocket代表了服务程序流套接字,这三个类均位于java.net包中。3.简述流式socket的通信机制,它最大的特点是什么?为什么可以实现无误的通信?【答】:在两个网络应用程序之间发送和接收信息时都需要建立一个可靠的连接,流套接字依靠TCP协议来保证信息正确到达目的地。IP包有可能在网络中丢失或者在传送过程中发生错误,任何一种情况发生,作为接收方的TCP将联系发送方TCP重新发送这个IP包。这就是所谓的在两个流套接字之间建立可靠的连接。4.用Java程序实现流式socket通信,需要使用哪两个类?它们是如何定义的?怎样使用?【答】:课后答案网一个是ServerSocket类,另一个是Socket类。当使用ServerSocket(intport)创建一个ServerSocket对象时,port参数传递端口号,这个端口就是服务器监听连接请求的端口。接下来服务程序进入无限循环之中。无限循环从调用ServerSocket的acceptwww.hackshp.cn()方法开始,在调用开始后accept()方法将导致调用线程阻塞直到连接建立。当客户程序需要与服务器程序通信时,客户程序在客户机创建一个socket对象。如果创建了一个Socket对象,那么它可能通过调用Socket的getInputStream()方法从服务程序获得输入流读传送来的信息,也可能通过调用Socket的getOutputStream()方法获得输出流来发送消息。5.利用Java的Frame类实现一个图形用户界面的程序,它的功能是接受用户输入的一个主机名,查找出它的IP地址并显示出来。【答】:略6.什么是端口号?Server端和Client端分别如何使用端口号?【答】:计算机"端口"是英文port的义译,可以认为是计算机与外界通讯交流的出口。软件领域若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cn的端口一般指网络中面向连接服务和无连接服务的通信协议端口,是一种抽象的软件结构,包括一些数据结构和I/O(基本输入输出)缓冲区。Server端通过类似ServerSocket(intport)的构造函数来使用端口号,Client端通过类似Socket(InetAddressaddr,intport)或者Socket(Stringhost,intport)的构造函数来使用端口号。7.试编写一程序完成下面的功能:第一种Client:接受第一种Client的输入,将这些IP地址(若是主机名也先转化成IP地址)记录下来,保存在特定的文件中,形成一个特别控制名单。第二种Client:在用户需要进行网络连接前,先向Server询问用户欲连接的IP地址是否在特别控制名单之中,若Server端回答是,则不允许这样的网络连接,否则协助用户完成网络连接。【答】:略。8.与流式socket相比,数据报通信有何特点?试举出一个典型网络数据报通信服务。【答】:UDP协议的全称是用户数据报(UserDatagramProtocal),在网络中它与TCP协议一样用于处理数据报。在OSI模型中,UDP位于第四层——传输层,处于IP协议的上一层。UDP有不提供数据报分组、组装以及不能对数据报排序的缺点。也就是说,当报文发送之后,是无法得知其是否安全完整到达的。所以它是一个面向非连接的应用,而Socket则是面向连接的应用。课后答案网www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cn习题十五1.什么是数据库系统?什么是关系数据库系统?目前主要有哪些关系数据库系统?【答】:数据库系统是由数据库及其管理软件组成的系统,一般由4个部分组成:①数据库,即存储在磁带、磁盘、光盘或其他外存介质上、按一定结构组织在一起的相关数据的集合。②数据库管理系统(DBMS)。它是一组能完成描述、管理、维护数据库的程序系统。它按照一种公用的和可控制的方法完成插入新数据、修改和检索原有数据的操作。③数据库管理员(DBA)。④用户和应用程序关系数据库系统的数据模型采用关系模型,它是建立在集合代数基础上,应用数学方法来处理数据库中的数据,将现实世界中的各种实体以及实体之间的各种联系均用表来表示。关系模型由关系数据结构、关系操作集合、关系完整性约束三部分组成。目前主要有Oracle、SQLServer、MySql、DB2等关系数据库。2.什么是SQL语言?与数据库前端操作的SQL语言主要有哪些?它们的功能如何?【答】:SQL语言是结构化查询语言,是关系数据库的标准语言。SQL语言由数据定义语言DDL、数据操作语言DML和数据控制语言DCL。他们覆盖了数据库生命周期的全部活动,包括:定义关系模式、插入数据、建立数据库;对数据库中的数据进行查询、更新和删除;数据库的重构和维护;数据库的安全性、完整性的控制等。3.JDBC的主要功能是什么?它由哪些部分组成?JDBC中驱动程序的主要功能是什么?简述Java程序中连接数据库的基本步骤。【答】:课后答案网JDBC是JavaDataBaseConnection的简称,是一种用Java实现的数据库接口技术,用于辅助Java程序实现数据库功能。JDBC由两层组成。上面一层是JDBCAPI,负责与Java应用程序通信,向Java应用程序提供数据(Java应用程序通过JDBC中提供的相关类来管理JDBC的驱动程序)。下面一层是JDBCDriverAPI,主要负责和具体数据环境的连接。www.hackshp.cnJDBC中驱动程序的主要功能是:和数据库建立连接、发送SQL执行语句、处理数据库操作的结果。Java程序连接数据库的基本步骤是:1)导入JDBC类;2)装载/注册驱动程序;3)连接数据库;4)创建语句对象Statement;5)执行SQL语句;6)处理结果;7)关闭连接4.比较JDBC-ODBC驱动和JDBC驱动连接数据库的异同。【答】:JDBC与某数据库系统专用的驱动程序相连,然后直接连入数据库,要下载和安装专门的驱动程序。而JDBC-ODBC桥实现JDBC到ODBC的转化,转化后就可以使用ODBC的数据库专用驱动程序与某个特定的数据库相连(即JDBC-ODBC中真正与数据库建立连接的是ODBC)。若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cn用JDBC-ODBC连接数据库之前首先要建立数据源,之后二者连接数据库的步骤完全一样,只是具体的驱动程序和连接字符串不一样。5.JDBCAPI是什么?它主要由哪些部分组成,各有什么功能?请举例说明。【答】:JDBCAPI是JAVA平台的重要技术,提供用Java编程语言编写标准SQL来对应用进行程序级访问,着重提供一个对SQL数据库的基本调用级接口。当前的JDBCAPI包括了java.sql包和javax,sql包。其中java.sql包围Java语言提供了应用接口来访问和处理存储在数据源的数据库;javax.sql包为服务器端的数据源访问和处理提供了应用接口。6.编程完成以下内容:接受用户输入的有关课程的信息,将这些信息合成记录插入数据库中;然后根据用户输入的课号进行数据库查询,并将结果显示在用户屏幕上。【答】:课后答案网www.hackshp.cnpackagejavabook.answer.ch15;importjava.awt.*;importjava.awt.event.*;importjava.sql.*;importjavax.swing.*;importjavax.swing.border.TitledBorder;publicclassEX6extendsJFrame{publicEX6(Stringss){若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cnsuper(ss);InsertPanelinsertPanel=newInsertPanel();QueryPanelqueryPanel=newQueryPanel();this.getContentPane().add(insertPanel,BorderLayout.NORTH);this.getContentPane().add(queryPanel,BorderLayout.CENTER);}privateclassInsertPanelextendsJPanel{privateJLabell1,l2,l3;privateJTextFieldtxt1,txt2,txt3;privateJButtonb1;InsertPanel(){JPanelp1=newJPanel();p1.setLayout(newFlowLayout());b1=newJButton("插入数据库");p1.add(b1);b1.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventarg0){insertToDB();}});JPanelp2=newJPanel();p2.setLayout(newGridLayout(3,2,10,10));l1=newJLabel("课程编号:");l2=newJLabel("课程名称:");l3=newJLabel("授课老师:");txt1=newJTextField(10);txt2=newJTextField(10);txt3=newJTextField(10);p2.add(l1);p2.add(txt1);课后答案网p2.add(l2);p2.add(txt2);p2.add(l3);p2.add(txt3);this.setLayout(newBorderLayout(10,10));this.add(p1,BorderLayout.www.hackshp.cnNORTH);this.add(p2,BorderLayout.CENTER);this.setBorder(newTitledBorder("数据库插入操作"));}voidinsertToDB(){Stringsql="insertintocoursevalues(""+txt1.getText()+"",""+txt2.getText()+"",""+txt3.getText()+"")";try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");Stringurl="jdbc:odbc:school";Stringuser="";Stringpassword="";Connectioncon=DriverManager.getConnection(url,user,若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cnpassword);Statementstmt=con.createStatement();intn=stmt.executeUpdate(sql);if(n==1)JOptionPane.showMessageDialog(this,"插入成功");elseJOptionPane.showMessageDialog(this,"插入失败");}catch(SQLExceptionsqle){JOptionPane.showMessageDialog(this,"数据库操作异常");}catch(Exceptionexec){JOptionPane.showMessageDialog(this,"程序异常");}}}privateclassQueryPanelextendsJPanel{privateJLabell1;privateJTextFieldtxt1;privateJButtonb2;privateJTextAreajtaQuery;QueryPanel(){JPanelp1=newJPanel();p1.setLayout(newGridLayout(1,3,10,10));l1=newJLabel("输入查询课程编号:");txt1=newJTextField(7);b2=newJButton("查询数据库");p1.add(l1);p1.add(txt1);p1.add(b2);b2.addActionListener(课后答案网newActionListener(){publicvoidactionPerformed(ActionEvente){queryFromDB();}});jtaQuery=newJTextArea();jtaQuery.setRows(5);www.hackshp.cnthis.setLayout(newBorderLayout(10,10));this.add(p1,BorderLayout.NORTH);this.add(jtaQuery,BorderLayout.CENTER);this.setBorder(newTitledBorder("数据库查询操作"));}voidqueryFromDB(){Stringsql="select*fromcoursewherecno=""+txt1.getText()+""";try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");Stringurl="jdbc:odbc:school";Stringuser="";若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cnStringpassword="";Connectioncon=DriverManager.getConnection(url,user,password);Statementstmt=con.createStatement();ResultSetrs=stmt.executeQuery(sql);if(rs!=null){rs.next();StringtempStr=rs.getString("cno")+"t"+rs.getString("cname")+"t"+rs.getString("cteacher");jtaQuery.setText(tempStr);}}catch(SQLExceptionsqle){JOptionPane.showMessageDialog(this,"数据库操作异常");}catch(Exceptionexec){JOptionPane.showMessageDialog(this,"程序异常");}}}publicstaticvoidmain(String[]args){EX6ds=newEX6("查看结果");ds.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);ds.pack();ds.setVisible(true);}}7.实验课后答案网1)设计一个关系数据库(至少包括3个表),并在SQLServer环境中建立这个数据库。2)用上题所建立的数据库作后台,设计JavaApplication实现数据库的查询、修改、插入和删除。【答】:在这个实验中,设计了3个表student,teacher,www.hackshp.cndepartment表,数据库采用了Access的数据库软件,实现了用JavaApplication对这3个表的插入,修改,删除等操作。代码如下,如果读者需要用到SQLServer,只需要将这些表格移植到SQLServer就可以了。若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cn//TableEditor.javapackagejavabook.answer.ch15;importjava.util.*;importjava.sql.*;importjavax.swing.table.*;importjavax.swing.event.*;importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;课后答案网classTableEditorextendsJPanel{privateConnectionconnection;//连接对象privateStringtableName;//需要打开的表格名称privateStatementstatement;//表达式对象privateResultSetresultSet;//www.hackshp.cn结果集privateDefaultTableModeltableModel=newDefaultTableModel();privateDefaultListSelectionModellistSelectionModel=newDefaultListSelectionModel();privateVector>rowVectors=newVector>();//表格内容向量privateVectorcolumnHeaderVector=newVector();//表格头部向量privateintcolumnCount;//表格列数目privateJButtonjbtFirst=newJButton("首行");privateJButtonjbtNext=newJButton("下一行");privateJButtonjbtPrior=newJButton("前一行");privateJButtonjbtLast=newJButton("末行");若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cnprivateJButtonjbtInsert=newJButton("插入");privateJButtonjbtDelete=newJButton("删除");privateJButtonjbtUpdate=newJButton("修改");privateJLabeljlblStatus=newJLabel();//状态栏privateJTablejTable1=newJTable();//数据表格publicTableEditor(){jTable1.setModel(tableModel);jTable1.setSelectionModel(listSelectionModel);JPaneljPanel1=newJPanel();setLayout(newBorderLayout());jPanel1.add(jbtFirst);jPanel1.add(jbtNext);jPanel1.add(jbtPrior);jPanel1.add(jbtLast);jPanel1.add(jbtInsert);jPanel1.add(jbtDelete);jPanel1.add(jbtUpdate);add(jPanel1,BorderLayout.NORTH);add(newJScrollPane(jTable1),BorderLayout.CENTER);add(jlblStatus,BorderLayout.SOUTH);jbtFirst.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventevt){moveCursor("first");}});jbtNext.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventevt){moveCursor("next");课后答案网}});jbtPrior.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventevt){moveCursor("previous");}www.hackshp.cn});jbtLast.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventevt){moveCursor("last");}});jbtInsert.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventevt){insert();}});jbtDelete.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventevt){若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cndelete();}});jbtUpdate.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventevt){update();}});listSelectionModel.addListSelectionListener(newListSelectionListener(){publicvoidvalueChanged(ListSelectionEvente){listSelectionModel_valueChanged(e);}});}privatevoiddelete(){try{resultSet.deleteRow();//删除当前记录refreshResultSet();//刷新结果集//修改表格tableModel.removeRow(listSelectionModel.getLeadSelectionIndex());}catch(Exceptionex){jlblStatus.setText(ex.toString());}}privatevoidinsert(){//打开插入数据对话框,用于插入新的记录try{JTextFieldt[]=newJTextField[columnCount];for(inti=0;i<=columnCount-1;i++){课后答案网t[i]=newJTextField(columnHeaderVector.get(i));}Stringbut[]={"确定","取消"};intgo=JOptionPane.showOptionDialog(null,t,"插入新记录",JOptionPane.YES_OPTION,JOptionPane.INFORMATION_MESSAGE,null,but,but[0]);www.hackshp.cnif(go==0){VectornewRecord=newVector();for(inti=0;i<=columnCount-1;i++){newRecord.addElement(t[i].getText());}tableModel.addRow(newRecord);for(inti=1;i<=columnCount;i++){resultSet.updateObject(i,newRecord.elementAt(i-1));}resultSet.insertRow();refreshResultSet();}若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cn}catch(Exceptionex){jlblStatus.setText(ex.toString());}}/**Setcursorinthetableandsettherownumberinthestatus*/privatevoidsetTableCursor()throwsException{introw=resultSet.getRow();listSelectionModel.setSelectionInterval(row-1,row-1);jlblStatus.setText("Currentrownumber:"+row);}privatevoidupdate(){try{introw=jTable1.getSelectedRow();for(inti=1;i<=resultSet.getMetaData().getColumnCount();i++){resultSet.updateObject(i,tableModel.getValueAt(row,i-1));}resultSet.updateRow();refreshResultSet();}catch(Exceptionex){jlblStatus.setText(ex.toString());}}privatevoidmoveCursor(StringwhereToMove){try{if(whereToMove.equals("first"))resultSet.first();elseif(whereToMove.equals("next"))resultSet.next();课后答案网elseif(whereToMove.equals("previous"))resultSet.previous();elseif(whereToMove.equals("last"))resultSet.last();setTableCursor();}catch(Exceptionex){www.hackshp.cnjlblStatus.setText(ex.toString());}}privatevoidrefreshResultSet(){try{resultSet=statement.executeQuery("select*from"+tableName);moveCursor("first");}catch(SQLExceptionex){ex.printStackTrace();}}若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn 课后答案网:www.hackshp.cnpublicvoidsetConnectionAndTable(ConnectionnewConnection,StringnewTableName){connection=newConnection;tableName=newTableName;try{statement=connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);showTable();moveCursor("first");}catch(SQLExceptionex){ex.printStackTrace();}}privatevoidshowTable()throwsSQLException{rowVectors.clear();columnHeaderVector.clear();resultSet=statement.executeQuery("select*from"+tableName);columnCount=resultSet.getMetaData().getColumnCount();while(resultSet.next()){VectorsingleRow=newVector();for(inti=0;i”结束。静态的页面代码主要完成像页面显示等工作;而动态代码部分则实现服务器端的计算。2.在你的电脑里面配置一个Jsp程序运行环境,使用Tomcat和Jdk。请问除了Tomcat外,还有什么软件可以做为Jsp的运行环境?【答】:除了Tomcat外,像Resin,WebLogic,WebSphereApplicationServer等都可以作为Jsp的运行服务器。3.一个标准的Jsp源程序中应该包含哪将几个目录,各自起什么作用?【答】:在任何一个jsp源程序目录中都应该有WEB-INF,其里面包含有classess和lib两个子目录,还有一个web.xml文件。其中web.xml是应该源程序的配置文件,而classess存放本应用程序所要使用到的一些javabean,lib用来存放一些库文件,比如连接数据库的驱动文件。4.在Jsp应用程序中连接SqlServer2000数据库时,需要哪几个做为驱动用的文件?【答】:需要mssql.jar、msbase.jar、msutil.jar三个文件作为驱动。5.在一般的WEB程序设计中,注销过程应如何设计?【答】:课后答案网通常是清空在登录时保存的相关session的值。www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!www.hackshp.cn'

您可能关注的文档