为了正常的体验网站,请在浏览器设置里面开启Javascript功能!
首页 > 《Java2实用教程》课后习题参考答案

《Java2实用教程》课后习题参考答案

2020-04-14 7页 doc 84KB 114阅读

用户头像 机构认证

金水文库

鑫淼网络科技有限公司主要经营:PPT设计 、课件制作,软文策划、合同简历设计、计划书策划案、各类模板等。公司秉着用户至上的原则服务好每一位客户

举报
《Java2实用教程》课后习题参考答案______________________________________________________________________________________________________________Java2实用教程(第三版)课后习题参考答案第1章Java入门1.开发与运行Java程序需要经过哪些主要步骤和过程?答:(1)编写Java源文件:使用文本编辑器(Edit或记事本),拓展名为.java(2)编译Java源文件:使用Java编译器(javac.exe)。得到字节码文件*.class(3)运行Jav...
《Java2实用教程》课后习题参考答案
______________________________________________________________________________________________________________Java2实用教程(第三版)课后习题参考答案第1章Java入门1.开发与运行Java程序需要经过哪些主要步骤和过程?答:(1)编写Java源文件:使用文本编辑器(Edit或记事本),拓展名为.java(2)编译Java源文件:使用Java编译器(javac.exe)。得到字节码文件*.class(3)运行Java程序:Java应用程序使用Java解释器(java.exe)执行字节码文件;Java小应用程序使用支持Java的浏览器来执行。2.怎样区分应用程序和小应用程序?应用程序的主类或小应用程序的主类必须用public修饰吗?答:①应用程序必须有main方法,这个方法是程序执行的入口。小应用程序没有main方法。②应用程序的主类不一定用public修饰;小应用程序的主类必须用public修饰。3.Java程序是由什么组成的?一个程序中必须要有public类吗?Java源文件的命名规则是怎样的?答:①Java程序由类组成。②应用程序可以没有public类;小应用程序一定有一个类是public类(主类)。③应用程序:如果只有一个类,源文件名与该类的类名相同,拓展名为.java;有多个类时,如果有public类(最多一个),源文件名与public类的类名相同,拓展名是.java;没有public类,源文件名与任何一个类的类名相同即可,拓展名为.java。小应用程序:源文件名与主类的类名相同,拓展名是.java。4.在运行小程序的HTML文件中可以使用codebase属性指定小程序的字节码所驻留的目录。如果不使用codebase属性,小程序的字节码文件必须和运行它的HTML文件在同一目录中。编写一个小程序并将小程序的字节码存放在某个目录中,比如C:\5000;把运行该小程序的HTML文件(注意其中的codebase属性):<appletcode=你的小程序的字节码width=200height=300codebase=C:\5000></applet>存放在另一个目录中。答:以中小应用程序为例进行说明:①编写Java小应用程序源代码importjava.applet.*;importjava.awt.*;publicclassBoyextendsApplet{publicvoidpaint(Graphicsg){g.setColor(Color.red);g.drawString("我一边喝着咖啡,一边学Java呢",5,30);g.setColor(Color.blue);g.drawString("我学得很认真",10,50);}}②将上述代码命名为Boy.java并进行编译得到Boy.class字节码文件;将得到的字节码文件存放在www.3che.com三车资料库——学习资源共享专家C:\5000文件夹下;③编写小应用程序的HTML源文件:<appletcode=Boy.classwdith=200height=300codebase=C:\5000></applet>④将上述编写好的代码命名为Boy.html;并将此文件存放在C:\5000文件夹以外的任意一个文件夹中(如C:\1000);⑤运行Boy.html。第2章标识符、关键字和数据类型1.什么叫标识符?标识符的规则是什么?答:①用来标识类名、变量名、、方法名、类型名、数组名、文件名的有效字符序列。②由字母、下划线、美元符号和数字组成,并且第一个字符不能是数字字符,而且关键字不能作为标识符。2.什么叫关键字?请说出5个关键字。答:①Java语言中已经被赋予特定意义的一些单词。②classbreakpublicreturnstaticextends等。3.Java的基本数据类型都是什么?答:boolean(逻辑型)char(字符型)float、double(浮点型)byte、short、int、long(整型)。4.下列哪些语句是错误的:intx=8;byteb=127;b=x;答:b=x语句错误;原因是高级别的变量赋值给低级别的变量时,一定要用显式转换即b=(byte)x;。5.下列程序的输出结果是什么?publicclassE{publicstaticvoidmain(Stringargs[]){long[]a={1,2,3,4};long[]b={100,200,300,400,500};b=a;System.out.println("数组b的长度:"+b.length);System.out.println("b[0]="+b[0]);}}答:数组b的长度:4b[0]=16.上机运行下列程序,注意观察输出结果。publicclassE{publicstaticvoidmain(Stringargs[]){for(inti=20302;i<20322;i++){System.out.println((char)i);www.3che.com三车资料库——学习资源共享专家}}}答:低住佐佑佒体佔何佖佗佘余佚佛作佝佞佟你佡7.System.out.println(“你好”);可输出字符串,也可以使用System.out.println()输出变量或达式的值,只需使用并置符号“+”将变量、表达式或一个常数值与一个字符串并置即可,如:System.out.println(“”+x);System.out.println(“:”+123+“大于”+122);等。上机调试下列程序,注意观察结果,特别注意System.out.print()和System.out.println()的区别。publicclassOutputData{publicstaticvoidmain(Stringargs[]){intx=234,y=432;System.out.println(x+"<"+(2*x));System.out.print("我输出结果后不回车");System.out.println("我输出结果后自动回车到下一行");System.out.println("x+y="+(x+y));System.out.println(""+x+y+"=234432");}}答:234<468我输出结果后不回车我输出结果后自动回车到下一行x+y=666234432=2344328.编写一个Java应用程序,输出全部的希腊字母。答:publicclassXLWords{publicstaticvoidmain(Stringargs[]){for(inti=913;i<930;i++){System.out.print((char)i+"");}for(intj=931;j<938;j++){System.out.print((char)j+"");}for(intk=945;k<962;k++){System.out.print((char)k+"");}for(intt=963;t<=969;t++){www.3che.com三车资料库——学习资源共享专家System.out.print((char)t+"");}}}第3章运算符、表达式和语句1.下列程序的输出结果是什么?publicclassE{publicstaticvoidmain(Stringargs[]){charx='你',y='e',z='吃';if(x>'A'){y='爱';z='情';}elsey='我';z='她';System.out.println(""+x+y+z);}}答:你爱她2.下列程序的输出结果是什么?publicclassE3{publicstaticvoidmain(Stringargs[]){charc='\0';for(inti=1;i<=4;i++){switch(i){case1:c='b';System.out.print(c);case2:c='e';System.out.print(c);break;case3:c='p';System.out.print(c);default:System.out.print("!");}}}}答:beep!!3.编写应用程序,求1!+2!+…+10!。答:classFact{publicstaticvoidmain(Stringargs[]){intfact,sum=0;for(inti=1;i<=10;i++){fact=1;for(intj=1;j<=i;j++)fact*=j;sum+=fact;}System.out.println("1到10的阶乘之和是:"+sum);}}4.编写一个应用程序,求100以内的全部素数。答:classPrimes{publicstaticvoidmain(Stringargs[]){intw=1;for(inti=2;i<=100;i++){for(intj=2;j<i;j++){w=i%j;if(w==0)break;}if(w!=0)System.out.println(i+"是素数");}}}5.分别用do―while和for循环计算1+1/2!+1/3!+1/4!+…的前20项和。答:①for循环classSum}}}答:beep!!3.编写应用程序,求1!+2!+…+10!。答:classFact{publicstaticvoidmain(Stringargs[]){intfact,sum=0;for(inti=1;i<=10;i++){fact=1;for(intj=1;j<=i;j++)fact*=j;sum+=fact;}System.out.println("1到10的阶乘之和是:"+sum);}}4.编写一个应用程序,求100以内的全部素数。答:classPrimes{publicstaticvoidmain(Stringargs[]){intw=1;for(inti=2;i<=100;i++){for(intj=2;j<i;j++){w=i%j;if(w==0)break;}if(w!=0)System.out.println(i+"是素数");}}}5.分别用do―while和for循环计算1+1/2!+1/3!+1/4!+…的前20项和。答:①for循环classSumsum=0;for(i=1;i<x;i++){if(x%i==0)sum+=i;}if(x==sum)System.out.println(x+"是完数");}}}7.编写应用程序,分别使用while和for循环计算8+88+888+…前10项之和。答:①for循环classTheSum{publicstaticvoidmain(Stringargs[]){longsum=0,data=8;for(inti=1;i<=10;i++){sum=sum+data;data=data*10+8;}System.out.println(sum);}}②while循环classTheSum{publicstaticvoidmain(Stringargs[]){longsum=0,data=8,i=0;while(++i<=10){sum=sum+data;data=data*10+8;}System.out.println(sum);}}8.编写应用程序,输出满足1+2+3+…+n<8888的最大正整数n。答:classMaxn{publicstaticvoidmain(Stringargs[]){intk=1,sum=0;while((sum+=k)<8888)k++;k--;System.out.println("最大能取到:"+k);}}第4章类、对象和接口1.类中的实例变量在什么时候会被分配内存空间?答:当该类创建对象之后,实例变量才会被分配相应的内存空间。2.什么叫方法的重载?构造方法可以重载吗?答:①一个类中可以有多个方法具有相同的名字,但这些方法的参数必须不同,即或者是参数的个数不同,或者是参数的类型不同(方法的重载体现了多态性,即功能多态性)。②构造方法可以重载。3.类中的实例方法可以操作类变量(static变量)吗?类方法(static方法)可以操作实例变量吗?答:①类中的实例方法可以操作类变量。②类方法不可以操作实例变量4.类中的实例方法可以用类名直接调用吗?答:类中的实例方法不可以用类名直接调用。5.举例说明protected方法和友好方法的区别。答:当子类与父类不在同一个包中时,子类可以继承父类的protected方法;而友好方法此时则不能被子类继承。6.举例说明类变量和实例变量的区别。答:⑴书写:定义成员变量时,类变量有static修饰;实例变量没有static修饰。例:classA{intx;//实例变量staticinty;//类变量}⑵内存:不创建对象,类的实例变量不会被分配内存空间;类变量被分配相应的内存空间。不同对象的实例变量被分配不同的内存空间;不同对象的类变量被分配相同的内存空间。任何一个对象改变类变量,其他对象的相应类变量也发生相应变化。一个对象的实例变量发生改变,不影响其他对象的相应实例变量。例:执行语句:A1.x=10;A1.y=20;这时A2.x的值也是10;而A2.y的值保持原来的初值。⑶使用:类变量可以被类方法操作;而实例变量不能被类方法操作。例:classA{intx;staticinty;staticvoidfunc(){b=10;//合法a=20;//非法}}类变量可以通过类名访问;实例变量不能通过类名访问。例:classA{intx;staticinty;}classB{publicvoidfunc();{A.x=10;//非法A.y=20;//合法}}7.子类将继承父类的哪些成员变量和方法?子类在什么情况下隐藏父类的成员变量和方法?在子类中是否允许有一个方法和父类的方法名字相同,而类型不同?答:①子类和父类在同一个包中时,子类可以继承父类的除private属性的所有方法和成员变量,当子类与父类不在同一个包中时,子类只能继承父类的protected和public属性的成员变量和方法。②子类中定义的成员变量和父类中的成员变量同名时,子类就隐藏了继承的成员变量;子类中定义一个方法,并且这个方法的名字、返回类型、参数个数和类型与从父类继承的方法完全相同,子类就隐藏从父类继承来的方法(方法的重写)。③在子类中允许有一个方法和父类的方法名字相同而类型不同。8.父类的final方法可以被子类重写吗?答:父类的final方法不能被子类重写。9.什么类中可以有abstract方法?答:abstract类中可以有abstract方法。10.什么叫对象的上转型对象?答:B类是A类的子类或间接子类,当用子类B创建一个对象b并把这个对象的引用放到A类的对象a中时,称A类对象a是子类对象b的上转型对象。11.什么叫接口的回调?答:可以把实现某一接口的类创建的对象的引用赋给该接口声明的接口变量中。12.下列程序有什么错误?publicclassTakecare{inta=90;staticfloatb=10.98f;publicstaticvoidmain(Stringargs[]){floatc=a+b;System.out.println("c="+c);}}答:语句floatc=a+b;错误。原因是类方法main操作了实例变量a。13.请写出下列程序的输出结果。classA{publicintf(intx){returnx+1;}}classBextendsA{publicintf(intx){returnx*x;}}publicclassE{publicstaticvoidmain(Stringargs[]){Aa=newB();intm=a.f(10);System.out.println(m);}}答:10014.请写出下列程序的输出结果。classA{intx;publicvoidsetX(intx){this.x=x;}intgetX(){returnx;}}classB{publicvoidf(Aa){a.setX(100);}}publicclassE{publicstaticvoidmain(Stringargs[]){Aa=newA();a.setX(8);System.out.println(a.getX());Bb=newB();b.f(a);System.out.println(a.getX());}}答:810015.使用接口有哪些注意事项?模仿例子4.27,编写一个类实现两个接口的程序。答:①一个类使用接口时,要有implements关键字,当一个类使用多个接口时,接口名要用逗号“,”隔开;使用接口的类除abstract类外,必须实现接口的所有方法,并且实现接口的方法时,方法名字、返回类型、参数个数及类型必须与接口中的完全一致;类在实现接口时,方法体一定要用public修饰,如果接口方法的返回类型不是void型,在类中实现接口时,方法体至少有一个return语句。②interface表面积{doubleallArea(doubler);}interface体积{doublevolu(doubler);}classSphimplements表面积,体积{doublePI=3.14159;publicdoubleallArea(doubler){return4*PI*r*r;}publicdoublevolu(doubler){return4.0/3*PI*r*r*r;}}publicclassTest{publicstaticvoidmain(Stringargs[]){doubler=5.0;Spha=newSph();System.out.println("半径为5的球的表面积是:"+a.allArea(r));System.out.println("半径为5的球的体积是:"+a.volu(r));}}16.编写一个类A,该类创建的对象可以调用方法f输出英文字母表,然后再编写一个该类的子类B,要求子类B必须继承A类的方法f(不允许重写),子类创建的对象不仅可以调用方法f输出英文字母表,而且调用子类新增的方法g输出希腊字母表。答:classA{intm;voidf(){for(m=65;m<91;m++)System.out.print((char)m+"");for(m=97;m<123;m++)System.out.print((char)m+"");System.out.println("");}}classBextendsA{inti;voidg(){for(i=913;i<930;i++)System.out.print((char)i+"");for(i=931;i<938;i++)System.out.print((char)i+"");for(i=945;i<962;i++)System.out.print((char)i+"");for(i=963;i<970;i++)System.out.print((char)i+"");System.out.println("");}}publicclassTest{publicstaticvoidmain(Stringargs[]){Bb=newB();System.out.println("我调用方法f输出英文字母表:");b.f();System.out.println("我调用方法g输出希腊字母表:");b.g();}}17.编写一个异常类MyException,再编写一个类Student,该类有一个产生异常的方法publicvoidspeak(intm)throwsMyException,要求参数m的值大于1000时,方法抛出一个MyException对象。最后编写主类,在主类的main方法中用Student创建一个对象,让该对象调用speak方法。答:classMyExceptionextendsException{Stringstr1;MyException(intm){str1=m+"出现错误可能造成的原因是取值大于1000";}publicvoidshowStr1(){System.out.println(str1);}}classStudent{publicvoidspeak(intm)throwsMyException{if(m>1000){MyExceptionexception=newMyException(m);throwexception;}elseSystem.out.println(m);}}publicclassTest{publicstaticvoidmain(Stringagrs[]){intm;Studentstu1=newStudent();m=987;try{stu1.speak(m);m=1234;stu1.speak(m);}catch(MyExceptione){e.showStr1();}}}18.编写一个类,该类有一个方法publicintf(inta,intb),该方法返回a和b的最大公约数。然后再编写一个该类的子类,要求子类重写方法f,而且重写的方法将返回a和b的最小公倍数。要求在重写的方法的方法体中首先调用被隐藏的方法返回a和b的最大公约数m,然后将乘积(a*b)/m返回。要求在应用程序的主类中分别使用父类和子类创建对象,并分别调用方法f计算两个正整数的最大公约数和最小公倍数。答:classA{publicintf(inta,intb){if(a<b){inttemp=0;temp=a;a=b;b=temp;}intr=a%b;while(r!=0){a=b;b=r;r=a%b;}returnb;}}classBextendsA{publicintf(inta,intb){intm;m=super.f(a,b);return(a*b)/m;}}publicclassTest{publicstaticvoidmain(Stringargs[]){Aa=newA();System.out.println("18和102的最大公约数是:"+a.f(18,102));Bb=newB();System.out.println("18和102的最小公倍数是:"+b.f(18,102));}}第5章字符串1.使用String类的publicStringtoUpperCase()方法可以将一个字符串中的小写字母变成大写字母,使用publicStringtoLowerCase()方法可以将一个字符串中的大写字母变成小写字母。编写一个程序,使用这两个方法实现大小写的转换。答:classTest{publicstaticvoidmain(Stringargs[]){Stringstr="IcanuseJava";System.out.println("要转换的字符串是:"+str);Strings=str.toUpperCase();System.out.println("转换成大写字符串是:"+s);s=str.toLowerCase();System.out.println("转换成小写字符串是:"+s);}}2.使用String类的publicStringconcat(Stringstr)方法可以把调用该方法的字符串与参数指定的字符串连接,把str指定的串连接到当前串的尾部获得一个新的串。编写一个程序通过连接两个串得到一个新串,并输出这个新串。答:classTest{publicstaticvoidmain(Stringargs[]){Stringstr1="Icanu";Stringstr2="seJava";Strings=str1.concat(str2);System.out.println("将字符串"+str1+"与字符串"+str2+"连接后得到的新字符串是:");System.out.println(s);}}3.String类的publiccharcharAt(intindex)方法可以得到当前字符串index位置上的一个字符。说出下列程序的输出结果。publicclassE3{publicstaticvoidmain(Stringargs[]){Strings="中国科学技术大学";chara=s.charAt(2),b=s.charAt(6);System.out.print(a);System.out.println(b);}}答:科大4.使用java.util包中的Arrays类的静态方法publicstaticvoidsort(doublea[])可以把参数a指定的double型数组按升序排序,使用java.util包中的Arrays类的静态方法publicstaticvoidsort(doublea[],intstart,intend)可以把参数a指定的double型数组中从位置start到end-1位置的数按升序排序。写出下列程序的输出结果。importjava.util.*;publicclassE4{publicstaticvoidmain(Stringargs[]){inta[]={23,67,89,90,-987};doubleb[]={12.89,90.87,34,678.987,-98.78,0.89};Arrays.sort(a);Arrays.sort(b,1,4);for(inti=0;i<=4;i++){System.out.print(a[i]+",");}for(inti=0;i<b.length;i++){System.out.print(b[i]+",");}}}答:-987,23,67,89,90,12.89,34.0,90.87,678.987,-98.78,0.89,5.使用java.lang包中System类的静态方法arraycopy可以实现数组的快速复制,上机实习下列程序,并总结出arraycopy方法参数的使用规则。publicclassArrayCopy{publicstaticvoidmain(Stringargs[]){chara1[]={'a','b','c','d','e','f'},b1[]={'1','2','3','4','5','6'};System.arraycopy(a1,0,b1,1,a1.length-1);System.out.println(newString(a1));System.out.println(newString(b1));bytea2[]={97,98,99,100,101,102},b2[]={65,67,68,69,70,71};System.arraycopy(b2,0,a2,3,b2.length-3);System.out.println(newString(a2));System.out.println(newString(b2));}}答:①运行结果:abcdef1abcdeabcACDACDEFG②arraycopy的方法是publicstaticvoidarraycopy(Objectsrc,intsrcPos,Objectdest,intdestPos,intlength)。其中五个参数分别表示:src-被复制的数组srcPos-从第几个元素开始复制dest-要复制到的数组destPos-从第几个元素开始粘贴length-一共需要复制的元素个数第6章时间、日期和数字1.用Data类不带参数的构造方法创建日期,要求日期的输出格式是:星期小时分秒。答:importjava.util.*;importjava.text.*;classTest{publicstaticvoidmain(Stringargs[]){Date时间=newDate();SimpleDateFormats=newSimpleDateFormat("EHH时mm分ss秒");System.out.println(s.format(时间));}}2.输出2006年2月的日历页,程序需处理闰年问题。答:importjava.util.*;classTest{publicstaticvoidmain(Stringargs[]){intyear=2006,month=2;intallDay;if((year%4==0&&year%100!=0)||(year%400==0))allDay=29;elseallDay=28;Calendarfeb=Calendar.getInstance();feb.set(2006,1,1);intdat=feb.get(Calendar.DAY_OF_WEEK)-1;Stringa[]=newString[dat+allDay];for(inti=0;i<dat;i++){a[i]="";}for(inti=dat,n=1;i<(dat+allDay);i++){if(n<=9)a[i]=String.valueOf(n)+"";elsea[i]=String.valueOf(n)+"";n++;}System.out.println(""+year+"年"+month+"月");System.out.println("日一二三四五六");for(intj=0;j<a.length;j++){if(j%7==0){System.out.println("");}System.out.print(a[j]);}}}3.计算某年、某月、某日和某年、某月、某日之间的天数间隔。要求年、月、日通过main方法的参数传递到程序中。答:importjava.util.*;classTest{publicstaticvoidmain(Stringargs[]){Calendarc=Calendar.getInstance();c.set(2000,0,1);longtime1=c.getTimeInMillis();c.set(2008,7,8);longtime2=c.getTimeInMillis();longdayCous=(time2-time1)/(1000*60*60*24);System.out.println("2008年8月8日和2000年1月1日相隔"+dayCous+"天");}}4.编程练习Math类的常用方法。答:importjava.text.*;publicclassTest{publicstaticvoidmain(Stringargs[]){doublea=Math.abs(-10);System.out.println("-10的绝对值是:"+a);doublemaxNum=Math.max(123.456,-5.4321);System.out.println("123.456与-5.4321中的最大值是:"+maxNum);doubleminNum=Math.min(123.456,-5.4321);System.out.println("123.456与-5.4321中的最小值是:"+minNum);intrandomNum=(int)(Math.random()*10)+1;System.out.println("输出一个1到10的随机数是:"+randomNum);doublepowNum=Math.pow(2,10);System.out.println("2的10次幂是:"+powNum);doublesqrtNum=Math.sqrt(10);System.out.println("10的平方根是:"+sqrtNum);doublelogNum=Math.log(2);System.out.println("2的对数是:"+logNum);doublesinNum=Math.sin(-10);System.out.println("-10的正弦值是:"+sinNum);doubleasinNum=Math.asin(0.5);System.out.println("0.5的反正弦值是:"+asinNum);System.out.println("格式化之前的数是:"+sqrtNum);NumberFormatf=NumberFormat.getInstance();f.setMaximumFractionDigits(10);f.setMinimumIntegerDigits(4);Strings=f.format(sqrtNum);System.out.println("格式化后:"+s);}}5.使用BigInteger类计算1!+3!+5!+7!+…的前30项的和。答:importjava.math.*;publicclassTest{publicstaticvoidmain(Stringargs[]){BigIntegersum=newBigInteger("0"),jieCheng=newBigInteger("1"),ONE=newBigInteger("1"),i=ONE;intk=0;while(++k<=30){sum=sum.add(jieCheng);i=i.add(ONE);jieCheng=jieCheng.multiply(i);i=i.add(ONE);jieCheng=jieCheng.multiply(i);}System.out.println(sum);}}第7章AWT组件及事件处理1.Frame类对象的默认布局是什么布局?和Panel类对象的默认布局相同吗?答:①Frame类对象的默认布局是BorderLayout布局;②不相同,Panel类对象的默认布局是FlowLayout布局。2.一个容器对象是否可以使用add方法添加一个Frame窗口?答:不可以。3.Checkbox对象可以触发ItemEvent事件吗?答:可以。4.编写应用程序,有一个标题为“计算的窗口”的窗口,窗口的布局为FlowLayout布局。窗口中添加两个文本区,当我们在一个文本区中输入若干个数时,另一个文本区,同时对输入的数进行求和运算并求出平均值,也就是说随着输入的变化,另一个文本区不断地更新求和及平均值。答:importjava.awt.*;importjava.awt.event.*;importjava.util.*;classCalculatedextendsFrameimplementsTextListener{TextAreatext1,text2;//定义了2个文本区Calculated(Strings)//标题为“计算的窗口”的窗口{super(s);setLayout(newFlowLayout());//窗口布局为FlowLayouttext1=newTextArea(5,23);text2=newTextArea(5,23);add(text1);add(text2);text2.setEditable(false);//显示求和结果和平均值的文本区禁止编辑text1.addTextListener(this);addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});setBounds(100,100,400,160);setVisible(true);validate();}publicvoidtextValueChanged(TextEvente){Strings=text1.getText();StringTokenizergeshu=newStringTokenizer(s);intn=geshu.countTokens();doublea[]=newdouble[n];for(inti=0;i<n;i++){Stringtemp=geshu.nextToken();doubledate=Double.parseDouble(temp);a[i]=date;}doublesum=0,average;for(inti=0;i<n;i++){sum=sum+a[i];}average=sum/n;text2.setText(null);text2.append("和:"+sum+"\n"+"平均数:"+average);}}publicclassTest{publicstaticvoidmain(Stringargs[]){Calculatedcalc=newCalculated("计算的窗口");}}5.文本区可以使用getSelectedText()方法获取该文本区通过拖动鼠标选中的文件。编写应用程序,有一个标题为“挑单词”的窗口,窗口的布局为BorderLayout布局。窗口中添加两个文本去和一个按钮组件,要求文本区分别添加到窗口的东部区域和西部区域;按钮添加到窗口的南部区域,当单击按钮时,程序将东部区域的文本区中鼠标选中的内容尾加到西部区域的文本区中。答:importjava.awt.*;importjava.awt.event.*;classWindowSelectedTextextendsFrameimplementsActionListener{TextAreatext1,text2;//定义2个文本区Buttonbutton;//定义一个按钮WindowSelectedText(Strings)//窗口名字为“挑单词”{super(s);setLayout(newBorderLayout());//窗口布局是BorderLayout布局text1=newTextArea(6,15);text2=newTextArea(6,15);button=newButton("确定");add(text1,BorderLayout.EAST);add(text2,BorderLayout.WEST);add(button,BorderLayout.SOUTH);button.addActionListener(this);addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});text2.setEditable(false);setBounds(100,100,350,200);setVisible(true);validate();}publicvoidactionPerformed(ActionEvente){if(e.getSource()==button){Strings=text1.getSelectedText()+"\n";Stringstr=text2.getText();text2.setText(str+s);}}}publicclassTest{publicstaticvoidmain(Stringargs[]){newWindowSelectedText("挑单词");}}6.编写一个应用程序,有一个标题为“计算”的窗口,窗口的布局为FlowLayout布局。设计4个按钮,分别命名为“加”、“差”、“积”、“除”,另外,窗口中还有3个文本框。单击相应的按钮,将两个文本框的数字做运算,在第三个文本框中显示结果。要求处理NumberFormatException。答:importjava.awt.*;importjava.awt.event.*;classCalculatedextendsFrameimplementsActionListener{TextFieldtext1,text2,text3;//3个文本框ButtonbuttonH,buttonC,buttonJ,buttonS;//4个按钮Calculated(Strings){super(s);setLayout(newFlowLayout());//FlowLayout布局text1=newTextField(10);text2=newTextField(10);text3=newTextField(17);buttonH=newButton("加");buttonC=newButton("差");buttonJ=newButton("积");buttonS=newButton("除");add(text1);add(text2);add(text3);text3.setEditable(false);add(buttonH);add(buttonC);add(buttonJ);add(buttonS);buttonH.addActionListener(this);buttonC.addActionListener(this);buttonJ.addActionListener(this);buttonS.addActionListener(this);addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});setBounds(100,100,160,180);setVisible(true);validate();}publicvoidactionPerformed(ActionEvente){doublenum1=0,num2=0,totle=0;try{num1=Double.parseDouble(text1.getText());num2=Double.parseDouble(text2.getText());if(e.getSource()==buttonH){totle=num1+num2;text3.setText("和"+totle);}elseif(e.getSource()==buttonC){totle=num1-num2;text3.setText("差"+totle);}elseif(e.getSource()==buttonJ){totle=num1*num2;text3.setText("积"+totle);}elseif(e.getSource()==buttonS){totle=num1/num2;text3.setText("商"+totle);}}catch(NumberFormatExceptionevent){text3.setText("请输入数字字符!");}}}publicclassTest{publicstaticvoidmain(Stringargs[]){Calculatedcalc=newCalculated("计算");//标题为“计算”的窗口}}7.改进例子7.16,在程序中增加一个名称为“确定”的按钮和一个文本区。当单击按钮时,程序验证用户是否输入了合法的E-mail地址格式,如果合法就将用户输入的姓名、E-mail和职业尾加到文本区中,否则在输入E-mail的文本框中提示用户输入了非法格式的E-mail地址。答:importjavax.swing.*;importjavax.swing.border.*;importjava.awt.*;importjava.awt.event.*;classWindowBoxextendsFrameimplementsActionListener{TextFieldtext1,text2,text3;TextAreatextarea;BoxbaseBox,boxV1,boxV2;Buttonbutton;WindowBox(){button=newButton("确定");textarea=newTextArea(6,12);text1=newTextField(12);text2=newTextField(12);text3=newTextField(12);boxV1=Box.createVerticalBox();boxV1.add(newLabel("姓名"));boxV1.add(Box.createVerticalStrut(8));boxV1.add(newLabel("email"));boxV1.add(Box.createVerticalStrut(8));boxV1.add(newLabel("职业"));boxV2=Box.createVerticalBox();boxV2.add(text1);boxV2.add(Box.createVerticalStrut(8));boxV2.add(text2);boxV2.add(Box.createVerticalStrut(8));boxV2.add(text3);baseBox=Box.createHorizontalBox();baseBox.add(boxV1);baseBox.add(Box.createHorizontalStrut(10));baseBox.add(boxV2);setLayout(newFlowLayout());add(baseBox);add(button);add(textarea);addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});textarea.setEditable(false);button.addActionListener(this);setBounds(100,100,210,250);setVisible(true);validate();}publicvoidactionPerformed(ActionEvente){booleana;intb;Strings;if(e.getSource()==button){s=text2.getText();a=s.endsWith(".com");b=s.indexOf("@");if(a&&b>0){Stringstr1=text1.getText()+"\n"+text2.getText()+"\n"+text3.getText()+"\n";Stringstr2=textarea.getText();textarea.setText(str2+str1);}else{text2.setText("输入了非法格式的E-mail地址");}}}}publicclassTest{publicstaticvoidmain(Stringargs[]){newWindowBox();}}8.写一个应用程序,要求编写一个Panel的子类MyPanel,MyPanel中有一个文本框和一个按钮,要求MyPanel的实例作为其按钮的ActionEvent事件的监视器,当单击按钮时,程序获取文本框中的文本,并将该文本作为按钮的名称。然后在编写一个Frame的子类,即窗口。窗口的布局为BorderLayout布局。窗口中添加两个MyPanel面板,分别添加到窗口的东部区域和西部区域。答:importjava.awt.*;importjava.awt.event.*;classMyPanelextendsPanelimplementsActionListener{Stringname;TextFieldtext;Buttonbutton;MyPanel(){text=newTextField(10);button=newButton("确定");add(text);add(button);button.addActionListener(this);addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});}publicvoidactionPerformed(ActionEvente){if(e.getSource()==button){name=text.getText();button.setLabel(name);}}}classMyFrameextendsFrame{MyPanelpanel1,panel2;MyFrame(){panel1=newMyPanel();panel2=newMyPanel();add(panel1,BorderLayout.EAST);add(panel2,BorderLayout.WEST);setBounds(100,100,400,100);setVisible(true);validate();}}publicclassTest{publicstaticvoidmain(Stringargs[]){MyFramewin=newMyFrame();}}9.参照例子7.18编写一个应用程序,要求有一个画布,在画布上绘制一个矩形,用户通过文本框输入矩形的宽和高以及矩形左上角的位置坐标。答:importjava.awt.*;importjava.awt.event.*;classMycanvasextendsCanvas{intx,y,w,h;Mycanvas(){setBackground(Color.cyan);}publicvoidsetX(intx){this.x=x;}publicvoidsetY(inty){this.y=y;}publicvoidsetW(intw){this.w=w;}publicvoidsetH(inth){this.h=h;}publicvoidpaint(Graphicsg){g.drawRect(x,y,w,h);}}classWindowCanvasextendsFrameimplementsActionListener{Mycanvascanvas;TextFieldtext1,text2,text3,text4;Buttonbutton;WindowCanvas(){canvas=newMycanvas();text1=newTextField(4);text2=newTextField(4);text3=newTextField(5);text4=newTextField(5);PanelpNorth=newPanel(),pSouth=newPanel();button=newButton("确定");button.addActionListener(this);pNorth.add(newLabel("矩形的宽:"));pNorth.add(text3);pNorth.add(newLabel("矩形的高:"));pNorth.add(text4);pSouth.add(newLabel("左上角位置坐标:"));pSouth.add(text1);pSouth.add(text2);pSouth.add(button);addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});add(canvas,BorderLayout.CENTER);add(pNorth,BorderLayout.NORTH);add(pSouth,BorderLayout.SOUTH);setBounds(100,100,500,500);setVisible(true);validate();}publicvoidactionPerformed(ActionEvente){intx,y,w,h;try{x=Integer.parseInt(text1.getText());y=Integer.parseInt(text2.getText());w=Integer.parseInt(text3.getText());h=Integer.parseInt(text4.getText());canvas.setX(x);canvas.setY(y);canvas.setW(w);canvas.setH(h);canvas.repaint();}catch(NumberFormatExceptionee){x=0;y=0;w=0;h=0;}}}publicclassTest{publicstaticvoidmain(Stringargs[]){newWindowCanvas();}}10.编写应用程序,有一个窗口对象,该窗口取它的默认布局:BorderLayout布局,北面添加一个List组件,该组件有四个商品名称的选项。中心添加一个文本区,当选择List组件中的某个选项后,文本区显示对该商品的价格和产地:当双击List组件中的某个选项后,文本区显示该商品的详细广告。答:importjava.awt.*;importjava.awt.event.*;classWindowGoodsextendsFrameimplementsActionListener,ItemListener{Strings[]={"产地:北京","产地:上海","产地:沈阳","产地:广东"};Stringp[]={"价格:3200","价格:158","价格:13.2","价格:320/打"};Stringa[]={"本商品****","本商品*****","本商品******","本商品*******"};Listlist;TextAreatext;WindowGoods(){list=newList(3,false);text=newTextArea(6,20);text.setEditable(false);list.add("商品1");list.add("商品2");list.add("商品3");list.add("商品4");add(list,BorderLayout.NORTH);add(text,BorderLayout.CENTER);list.addItemListener(this);list.addActionListener(this);addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});setBounds(100,100,300,300);setVisible(true);validate();}publicvoiditemStateChanged(ItemEvente){if(e.getItemSelectable()==list){intm=list.getSelectedIndex();text.setText(p[m]+'\n'+s[m]);}}publicvoidactionPerformed(ActionEvente){intn=list.getSelectedIndex();text.setText(a[n]);}}publicclassTest{publicstaticvoidmain(Stringargs[]){newWindowGoods();}}11.编写程序,观察各种组件设置背景色和前景色的情况。答:importjava.awt.*;importjava.awt.event.*;classWindowColorextendsFrameimplementsActionListener{Buttonbutton;//按钮TextFieldtextfield;//文本框TextAreatextarea;//文本区Mypanelpanel;//面板Checkboxbox;//选择框Choicechoice;//下拉列表Listlist;//滚动列表Labellabel;//标签Mycanvascan;//画布ButtonbuttonBackColor,buttonForeColor;WindowColor(){button=newButton("我是按钮");textfield=newTextField("我是文本框",10);textarea=newTextArea(6,15);textarea.setText("我是文本区");textfield.setEditable(false);textarea.setEditable(false);panel=newMypanel();box=newCheckbox("我是选择框");choice=newChoice();choice.add("我是下拉列表");list=newList(3,false);list.add("我是滚动列表");label=newLabel("我是标签");can=newMycanvas();buttonBackColor=newButton("背景色");buttonForeColor=newButton("前景色");setLayout(newFlowLayout());add(button);add(textfield);add(textarea);add(panel);add(box);add(choice);add(list);add(label);add(can);add(buttonBackColor);add(buttonForeColor);addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});buttonBackColor.addActionListener(this);buttonForeColor.addActionListener(this);setBounds(100,100,300,300);setVisible(true);validate();}publicvoidactionPerformed(ActionEvente){if(e.getSource()==buttonBackColor){button.setBackground(Color.yellow);textfield.setBackground(Color.yellow);textarea.setBackground(Color.yellow);panel.setBackground(Color.yellow);box.setBackground(Color.yellow);choice.setBackground(Color.yellow);list.setBackground(Color.yellow);label.setBackground(Color.yellow);can.setBackground(Color.yellow);}elseif(e.getSource()==buttonForeColor){button.setForeground(Color.blue);textfield.setForeground(Color.blue);textarea.setForeground(Color.blue);panel.setForeground(Color.blue);box.setForeground(Color.blue);choice.setForeground(Color.blue);list.setForeground(Color.blue);label.setForeground(Color.blue);can.setForeground(Color.blue);}}}classMycanvasextendsCanvas{Mycanvas(){}publicvoidpaint(Graphicsg){g.drawString("我是画布",5,5);}}classMypanelextendsPanel{Buttonbutton1;Mypanel(){button1=newButton("我是面板");add(button1);}}publicclassTest{publicstaticvoidmain(Stringargs[]){newWindowColor();}}12.编写应用程序,有一个标题为“移动”的窗口,窗口的布局为null,在窗口中有两个按钮,单击一个按钮让另一个按钮移动。答:importjava.awt.*;importjava.awt.event.*;classWindowMoveextendsFrameimplementsActionListener{Buttonbutton1,button2;WindowMove(Strings){super(s);setLayout(null);button1=newButton("我让它横向走动");button2=newButton("我让它纵向走动");button1.setBackground(Color.blue);button2.setBackground(Color.green);button1.addActionListener(this);button2.addActionListener(this);button1.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));button2.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));add(button1);add(button2);addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});button1.setBounds(20,80,100,30);button2.setBounds(100,180,100,30);setBounds(100,100,500,500);setVisible(true);validate();}publicvoidactionPerformed(ActionEvente){Rectanglerect1=button1.getBounds();intx1=(int)rect1.getX();inty1=(int)rect1.getY();Rectanglerect2=button2.getBounds();intx2=(int)rect2.getX();inty2=(int)rect2.getY();if(e.getSource()==button1){x2=x2+5;button2.setLocation(x2,y2);}elseif(e.getSource()==button2){y1=y1+5;button1.setLocation(x1,y1);}}}publicclassTest{publicstaticvoidmain(Stringargs[]){newWindowMove("移动");}}13.编写应用程序,有一个标题为“改变颜色”的窗口,窗口的布局为null,在窗口中有3个按钮和一个画布,3个按钮的颜色分别是红、绿、蓝。单击相应的按钮,画布绘制相应颜色的圆。答:importjava.awt.*;importjava.awt.event.*;classWindowChangeColorextendsFrameimplementsActionListener{ButtonbuttonRed,buttonGreen,buttonBlue;Mycanvascanvas;WindowChangeColor(Strings){super(s);setLayout(null);buttonRed=newButton("红色");buttonGreen=newButton("绿色");buttonBlue=newButton("蓝色");canvas=newMycanvas();buttonRed.setBackground(Color.red);buttonGreen.setBackground(Color.green);buttonBlue.setBackground(Color.blue);add(canvas);canvas.setBounds(10,10,150,150);add(buttonRed);buttonRed.setBounds(10,170,50,30);add(buttonGreen);buttonGreen.setBounds(70,170,50,30);add(buttonBlue);buttonBlue.setBounds(130,170,50,30);buttonRed.addActionListener(this);buttonGreen.addActionListener(this);buttonBlue.addActionListener(this);addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});setBounds(100,100,200,250);setVisible(true);validate();}publicvoidactionPerformed(ActionEvente){if(e.getSource()==buttonRed){canvas.setX(1);canvas.repaint();}elseif(e.getSource()==buttonGreen){canvas.setX(2);canvas.repaint();}elseif(e.getSource()==buttonBlue){canvas.setX(3);canvas.repaint();}}}classMycanvasextendsCanvas{intx=0;Mycanvas(){setBackground(Color.white);}publicvoidsetX(inty){x=y;}publicvoidpaint(Graphicsg){switch(x){case1:g.setColor(Color.red);break;case2:g.setColor(Color.green);break;case3:g.setColor(Color.blue);break;default:g.setColor(Color.white);}g.drawOval(65,65,50,50);}}publicclassTest{publicstaticvoidmain(Stringargs[]){newWindowChangeColor("改变颜色");}}14.编写应用程序,测试Cursor类中表示鼠标形状的静态常量。答:importjava.awt.*;importjava.awt.event.*;classWindowCursorextendsFrameimplementsActionListener{Buttonbutton,button1;TextFieldtext;intn=-1;WindowCursor(){button=newButton("单击我");text=newTextField("将鼠标放在上面的按钮上看形状");button1=newButton("看看你鼠标的形状");add(button,BorderLayout.NORTH);add(button1,BorderLayout.CENTER);add(text,BorderLayout.SOUTH);button.setBackground(Color.cyan);button1.setBackground(Color.pink);button.addActionListener(this);addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});setBounds(100,100,190,150);setVisible(true);validate();}publicvoidactionPerformed(ActionEvente){n=(n+1)%10;switch(n){case0:button1.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));break;case1:button1.setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));break;case2:button1.setCursor(Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR));break;case3:button1.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));break;case4:button1.setCursor(Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR));break;case5:button1.setCursor(Cursor.getPredefinedCursor(Cursor.NW_RESIZE_CURSOR));break;case6:button1.setCursor(Cursor.getPredefinedCursor(Cursor.NE_RESIZE_CURSOR));break;case7:button1.setCursor(Cursor.getPredefinedCursor(Cursor.W_RESIZE_CURSOR));break;case8:button1.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));break;case9:button1.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));break;}}}publicclassTest{publicstaticvoidmain(Stringargs[]){newWindowCursor();}}15.改进本章例子7.30,当释放鼠标键时,如果当前组件和其他组件相交,就将其他组件设置为不可见状态。答:importjava.awt.*;importjava.awt.event.*;importjavax.swing.SwingUtilities;classWinextendsFrameimplementsMouseListener,MouseMotionListener{Buttonbutton;TextFieldtext;intx,y;booleanmove=false;Win(){button=newButton("用鼠标拖动我");text=newTextField("用鼠标拖动我",8);text.setBackground(Color.green);button.setBackground(Color.blue);button.addMouseListener(this);button.addMouseMotionListener(this);text.addMouseListener(this);text.addMouseMotionListener(this);addMouseMotionListener(this);setLayout(newFlowLayout());add(button);add(text);addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});setBounds(10,10,350,300);setVisible(true);validate();}publicvoidmousePressed(MouseEvente){}publicvoidmouseReleased(MouseEvente){move=false;Rectanglerect=button.getBounds();intx=(int)rect.getX();inty=(int)rect.getY();if(rect.intersects(text.getBounds())){if(e.getSource()==button){text.setVisible(false);}elseif(e.getSource()==text){button.setVisible(false);}}}publicvoidmouseEntered(MouseEvente){}publicvoidmouseExited(MouseEvente){}publicvoidmouseClicked(MouseEvente){}publicvoidmouseMoved(MouseEvente){}publicvoidmouseDragged(MouseEvente){Componentcom=null;if(e.getSource()instanceofComponent){com=(Component)e.getSource();if(com!=this)move=true;e=SwingUtilities.convertMouseEvent(com,e,this);if(move){x=e.getX();y=e.getY();intw=com.getSize().width,h=com.getSize().height;com.setLocation(x-w/2,y-h/2);}}}}publicclassTest{publicstaticvoidmain(Stringargs[]){Winwin=newWin();}}16.进一步改进本章例子7.33,要求一个按钮在移动时,不允许和其他按钮相交。答:importjava.awt.*;importjava.awt.event.*;classWinextendsFrameimplementsKeyListener{Buttonb[]=newButton[8];intx,y;Win(){setLayout(newFlowLayout());for(inti=0;i<8;i++){b[i]=newButton(""+i);b[i].addKeyListener(this);add(b[i]);}addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});setBounds(10,10,300,300);setVisible(true);validate();}publicvoidkeyPressed(KeyEvente){booleanmove=false;Buttonbutton=(Button)e.getSource();Rectanglebuttonrect=button.getBounds();Stringstr=button.getLabel();intxx=Integer.parseInt(str);x=button.getBounds().x;y=button.getBounds().y;if(e.getKeyCode()==KeyEvent.VK_UP){y=y-2;if(y<=0)y=0;}elseif(e.getKeyCode()==KeyEvent.VK_DOWN){y=y+2;if(y>=300)y=300;}elseif(e.getKeyCode()==KeyEvent.VK_LEFT){x=x-2;if(x<=0)x=0;}elseif(e.getKeyCode()==KeyEvent.VK_RIGHT){x=x+2;if(x>=300)x=300;}buttonrect.setLocation(x,y);for(intk=0;k<8;k++){Rectanglerect=b[k].getBounds();if((buttonrect.intersects(rect))&&(xx!=k)){move=true;}}if(move==false){button.setLocation(x,y);}}publicvoidkeyTyped(KeyEvente){}publicvoidkeyReleased(KeyEvente){}}publicclassTest{publicstaticvoidmain(Stringargs[]){Winwin=newWin();}}第8章建立对话框1.编写一个应用程序,用户可以在一个文本框里输入数字字符,按Enter键后将数字放入一个文本区。当输入的数字大于1000时,弹出一个有模式的对话框,提示用户数字已经大于1000,是否继续将该数字放入文本区。答:importjava.awt.event.*;importjava.awt.*;importjavax.swing.JOptionPane;classWindowSaveNumberextendsFrameimplementsActionListener{TextFieldtextInputNumber;TextAreatextSaveNumber;WindowSaveNumber(){textInputNumber=newTextField(15);textSaveNumber=newTextArea();add(textInputNumber,BorderLayout.NORTH);add(textSaveNumber,BorderLayout.CENTER);textInputNumber.addActionListener(this);setBounds(100,100,400,300);setVisible(true);validate();addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});}publicvoidactionPerformed(ActionEvente){Strings=textInputNumber.getText();intnum=Integer.parseInt(s);if(num<=1000){textSaveNumber.append('\n'+s);textInputNumber.setText(null);}else{intn=JOptionPane.showConfirmDialog(this,"数字已经大于1000是否继续将该数字放入文本区","确认对话框",JOptionPane.YES_NO_OPTION);if(n==JOptionPane.YES_OPTION){textSaveNumber.append('\n'+s);}elseif(n==JOptionPane.NO_OPTION){textInputNumber.setText(null);}}}}publicclassTest{publicstaticvoidmain(Stringargs[]){newWindowSaveNumber();}}2.参考Windows平台的NotePad,编写一个简单的“记事本”程序。答:importjava.awt.*;importjava.awt.event.*;importjavax.swing.JOptionPane;classNotepadextendsFrameimplementsActionListener{MenuBarmenubar;Menumenu1,menu2,menu3,menu5;MenuItemitem[]=newMenuItem[23];TextAreatext;FileDialogfiledialog_save;FileDialogfiledialog_load;Notepad(Strings){super(s);menubar=newMenuBar();menu1=newMenu("文件");menu2=newMenu("编辑");menu3=newMenu("格式");menu5=newMenu("帮助");item[0]=newMenuItem("新建");item[0].setShortcut(newMenuShortcut(KeyEvent.VK_N));item[1]=newMenuItem("打开");item[1].setShortcut(newMenuShortcut(KeyEvent.VK_O));item[3]=newMenuItem("保存");item[3].setShortcut(newMenuShortcut(KeyEvent.VK_S));item[4]=newMenuItem("页面设置");item[5]=newMenuItem("打印");item[5].setShortcut(newMenuShortcut(KeyEvent.VK_P));item[6]=newMenuItem("退出");item[7]=newMenuItem("撤销");item[7].setShortcut(newMenuShortcut(KeyEvent.VK_Z));item[8]=newMenuItem("剪切");item[8].setShortcut(newMenuShortcut(KeyEvent.VK_X));item[9]=newMenuItem("复制");item[9].setShortcut(newMenuShortcut(KeyEvent.VK_C));item[10]=newMenuItem("粘贴");item[10].setShortcut(newMenuShortcut(KeyEvent.VK_V));item[11]=newMenuItem("删除");item[12]=newMenuItem("查找");item[13]=newMenuItem("查找下一个");item[14]=newMenuItem("替换");item[15]=newMenuItem("转到");item[16]=newMenuItem("全选");item[17]=newMenuItem("时间/日期");item[18]=newCheckboxMenuItem("自动换行");item[21]=newMenuItem("帮助主题");item[22]=newMenuItem("关于记事本");text=newTextArea();filedialog_save=newFileDialog(this,"保存文件",FileDialog.SAVE);filedialog_load=newFileDialog(this,"打开文件",FileDialog.LOAD);filedialog_save.setVisible(false);filedialog_load.setVisible(false);filedialog_save.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){filedialog_save.setVisible(false);}});filedialog_load.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){filedialog_load.setVisible(false);}});menu1.add(item[0]);menu1.add(item[1]);menu1.add(item[3]);menu1.addSeparator();menu1.add(item[4]);menu1.add(item[5]);menu1.addSeparator();menu1.add(item[6]);menu2.add(item[7]);menu2.addSeparator();menu2.add(item[8]);menu2.add(item[9]);menu2.add(item[10]);menu2.add(item[11]);menu2.addSeparator();menu2.add(item[12]);menu2.add(item[13]);menu2.add(item[14]);menu2.add(item[15]);menu2.addSeparator();menu2.add(item[16]);menu2.add(item[17]);menu3.add(item[18]);menu5.add(item[21]);menu5.addSeparator();menu5.add(item[22]);menubar.add(menu1);menubar.add(menu2);menubar.add(menu3);menubar.add(menu5);item[0].addActionListener(this);item[1].addActionListener(this);item[3].addActionListener(this);item[6].addActionListener(this);item[21].addActionListener(this);item[22].addActionListener(this);setMenuBar(menubar);add(text,BorderLayout.CENTER);setBounds(100,100,600,400);addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});setVisible(true);validate();}publicvoidactionPerformed(ActionEvente){if(e.getSource()==item[0])//完成新建{text.setText(null);}elseif(e.getSource()==item[1])//完成打开{filedialog_load.setVisible(true);}elseif(e.getSource()==item[3])//完成保存{filedialog_save.setVisible(true);}elseif(e.getSource()==item[6])//完成退出{System.exit(0);}elseif(e.getSource()==item[21]){JOptionPane.showMessageDialog(this,"此版本中有很多功能没有实现\n剩余功能正在开发中\n请等待下一版本","帮助主题",JOptionPane.INFORMATION_MESSAGE);}elseif(e.getSource()==item[22]){JOptionPane.showMessageDialog(this,"名称:自己做的NotePad\n作者:王财\n版本:NotePad1.1\n运行平台:Windows平台","关于记事本",JOptionPane.INFORMATION_MESSAGE);}}}publicclassTest{publicstaticvoidmain(String[]args){newNotepad("自己做的NotePad");}}注:本题意义在于用本章学的内容添加一些对话框;此程序中有两种对话框的掉用;此程序只有大体模型,功能方面大部分都没有去实现。等学了第10章输入输出流以后,可以把本题当做课程设计去做。我这有做完的完整程序,有能力的想要的可以联系我。第9章Java多线程机制1.线程有几种状态?答:一个线程在它的一个完整的生命周期有4种状态,分别是:新建、运行、中断和死亡,即(运行、就绪、挂起、结束)。2.引起线程中断的常见原因是什么?答:①JVM将CPU资源从当前线程切换给其他线程,使本线程让出CPU的使用权处于中断状态;②线程使用CPU资源期间,执行了sleep(intmillsecond)方法,使当前线程进入休眠状态;③线程使用CPU资源期间,执行了wait()方法,使得当前线程进入等待状态;④线程使用CPU资源期间,执行某个操作进入阻塞状态,比如执行读/写操作引起阻塞。3.一个线程执行完run()方法后,进入了什么状态?该线程还能再调用start()方法吗?答:执行完run()方法后,进入了死亡状态;此时不能再调用start()方法。4.线程在什么状态时,调用isAlive()方法返回的值是false。答:线程处于“新建”状态时,线程调用调用isAlive()方法返回的值是false。当线程处于“死亡”状态时,其返回值也是false.5.建立线程有几种方法?答:①用Thread类直接创建一个线程;创建时要向构造方法Thread(Runnabletarget)传递一个Runnable接口的实例。②用Thread类的子类创建一个线程;需要重写父类的run()方法。6.怎样设置线程的优先级?答:线程的优先级通过setPriority(intgrade)方法设置,需要传递一个在0-10的int型参数。7.在多线程中,为什么要引入同步机制?答:引入同步机制解决了当两个或两个以上线程同时访问同一个变量,并且一个线程需要修改这个变量时发生的混乱。8.在什么地方wait()方法、notify()及notifyAll()方法可以被调用?答:①通常在线程的同步方法中使用到它们。②不涉及同步的时候也可以调用,wait()方法挂起一个线程,notifyAll()方法使得挂起的线程恢复。9.将例子9.14中的循环条件:while(五元钱的个数<3)改写成:if(五元钱的个数<3)是否合理。答:合理;因为在这道题中,while并不代表循环,而是表示条件,所以可以用if代换。10.线程调用interrupt()的作用是什么?答:interrupt()方法用来“吵醒”休眠的线程。即:它所完成的是当线程处于阻塞状态时,抛出InterruptedException异常,使其从阻塞状态退出来。注:interrupt()方法不会中断一个正在运行的线程。11.参照例子9.11编写一个应用程序,有两个线程,一个负责模仿垂直上抛运动,另一个模仿45°的抛体运动。答:importjava.awt.*;importjava.awt.event.*;publicclassTest{publicstaticvoidmain(Stringargs[]){MyFrameframe=newMyFrame();frame.setBounds(10,10,500,500);frame.setVisible(true);frame.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});}}classMyFrameextendsFrameimplementsRunnable{Thread红色球,蓝色球;MyCanvasred,blue;doublet=0;MyFrame(){红色球=newThread(this);蓝色球=newThread(this);red=newMyCanvas(Color.red);blue=newMyCanvas(Color.blue);setLayout(null);add(red);add(blue);red.setLocation(60,100);blue.setLocation(60,100);红色球.start();蓝色球.start();}publicvoidrun(){while(true){t=t+0.2;intv0=20;if(t>20)t=0;if(Thread.currentThread()==红色球){intx=60;inth=300-((int)(v0*t-1.0/2*t*t*3.8)+60);red.setLocation(x,h);try{红色球.sleep(50);}catch(InterruptedExceptione){}}elseif(Thread.currentThread()==蓝色球){intx=60+(int)(26*t);inth=300-((int)(v0*t-1.0/2*t*t*3.8)+60);blue.setLocation(x,h);try{蓝色球.sleep(50);}catch(InterruptedExceptione){}}}}}classMyCanvasextendsCanvas{Colorc;MyCanvas(Colorc){setSize(20,20);this.c=c;}publicvoidpaint(Graphicsg){g.setColor(c);g.fillOval(0,0,20,20);}}12.参照例子9.14,模拟3个人排队买票,张某、李某和赵某买电影票,售票员只有3张五元的钱,电影票五元一张。张某拿二十元一张的人民币排在李某的前面买票,李某排在赵某的前面拿一张十元的人民币买票,赵某拿一张五元的人民币买票。答:importjava.awt.*;importjava.awt.event.*;publicclassTest{publicstaticvoidmain(Stringargs[]){newMyFrame();}}classMyFrameextendsFrameimplementsRunnable,ActionListener{售票员王小姐;Thread张某,李某,赵某;staticTextAreatext;Buttonstart=newButton("排队买票");MyFrame(){王小姐=new售票员();//只有3张五元钱电影票五元一张张某=newThread(this);//二十元排在最前面李某=newThread(this);//十元排在中间赵某=newThread(this);//五元排在最后text=newTextArea(10,30);start.addActionListener(this);add(text,BorderLayout.CENTER);add(start,BorderLayout.NORTH);setVisible(true);setSize(360,300);validate();addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});}publicvoidactionPerformed(ActionEvente){try{张某.start();李某.start();赵某.start();}catch(Exceptionexp){}}publicvoidrun(){if(Thread.currentThread()==张某){王小姐.售票规则(20);}elseif(Thread.currentThread()==李某){王小姐.售票规则(10);}elseif(Thread.currentThread()==赵某){王小姐.售票规则(5);}}}class售票员{int五元钱个数=3,十元钱个数=0,二十元钱个数=0;Strings=null;publicsynchronizedvoid售票规则(intmoney){if(money==5){五元钱个数=五元钱个数+1;s="给您入场卷您的钱正好";MyFrame.text.append("\n"+s);}elseif(money==10){while(五元钱个数<1){try{wait();}catch(InterruptedExceptione){}}五元钱个数=五元钱个数-1;十元钱个数=十元钱个数+1;s="给您入场卷"+"您给我10元,找您5元";MyFrame.text.append("\n"+s);}elseif(money==20){while((五元钱个数<4)&&(五元钱个数<1||十元钱个数<1)){try{wait();}catch(InterruptedExceptione){}}if(五元钱个数>=4){五元钱个数=五元钱个数-3;二十元钱个数=二十元钱个数+1;s="给您入场卷"+"您给我20元,找您15元";MyFrame.text.append("\n"+s);}elseif(五元钱个数>=1&&十元钱个数>=1){五元钱个数=五元钱个数-1;十元钱个数=十元钱个数-1;二十元钱个数=二十元钱个数+1;s="给您入场卷"+"您给我20元,找您15元";MyFrame.text.append("\n"+s);}}notifyAll();}}13.参照例子9.9,要求有3个线程:student1、student2和teacher,其中student1准备睡10分钟后再开始上课,其中student2准备睡一小时后再开始上课。teacher在输出3句“上课”后,吵醒休眠的线程student1;student1被吵醒后,负责再吵醒休眠的线程student2。答:classInterruptSleepimplementsRunnable{Threadstudent1,student2,teacher;InterruptSleep(){teacher=newThread(this);student1=newThread(this);student2=newThread(this);}publicvoidrun(){if(Thread.currentThread()==student2){try{System.out.println("student2要睡一小时再听课,现在不听课");Thread.sleep(1000*60*60);}catch(InterruptedExceptione){System.out.println("student2还没睡够呢,但是被student1给叫醒了");}System.out.println("student2开始上课");}elseif(Thread.currentThread()==student1){try{System.out.println("student1要睡10分钟再上课,现在不听课");Thread.sleep(1000*60*10);}catch(InterruptedExceptione){System.out.println("student1还没睡够呢,但是被teacher给叫醒了");}System.out.println("student1开始上课");student2.interrupt();}elseif(Thread.currentThread()==teacher){for(inti=1;i<=3;i++){System.out.println("teacher:上课!");try{Thread.sleep(500);}catch(InterruptedExceptione){}}student1.interrupt();}}}publicclassTest{publicstaticvoidmain(String[]args){InterruptSleepa=newInterruptSleep();a.student2.start();a.student1.start();a.teacher.start();}}14.参照例子9.19,编写一个Java应用程序,在主线程中再创建3个线程:“运货司机”、“装运工”和“仓库管理员”。要求线程“运货司机”占有CPU资源后立刻联合线程“装运工”,也就是让“运货司机”一直等到“装运工”完成工作才能开车,而“装运工”占有CPU资源后立刻联合线程“仓库管理员”,也就是让“装运工”一直等到“仓库管理员”打开仓库才能开始搬运货物。答:publicclassTest{publicstaticvoidmain(Stringargs[]){ThreadJoina=newThreadJoin();a.运货司机.start();a.装运工.start();a.仓库管理员.start();}}classThreadJoinimplementsRunnable{Goodsgoods;Thread运货司机,装运工,仓库管理员;ThreadJoin(){运货司机=newThread(this);装运工=newThread(this);仓库管理员=newThread(this);运货司机.setName("运货司机");装运工.setName("装运工");仓库管理员.setName("仓库管理员");}publicvoidrun(){if(Thread.currentThread()==运货司机){System.out.println(运货司机.getName()+"等"+装运工.getName()+"装运货物");try{装运工.join();}catch(InterruptedExceptione){}System.out.println(运货司机.getName()+"开始运输"+goods.name);}elseif(Thread.currentThread()==装运工){System.out.println(装运工.getName()+"等"+仓库管理员.getName()+"打开仓库");try{仓库管理员.join();}catch(InterruptedExceptione){}System.out.println(装运工.getName()+"开始搬运"+goods.name);}elseif(Thread.currentThread()==仓库管理员){System.out.println(仓库管理员.getName()+"准备打开仓库,请等待......");try{仓库管理员.sleep(2000);}catch(InterruptedExceptione){}goods=newGoods("一批货物");System.out.println(仓库管理员.getName()+"已经打开仓库,可以搬运了");}}}classGoods{Stringname;Goods(Stringname){this.name=name;}}15.在下列程序的主线程main方法中,又开始运行了几个线程?importjava.awt.*;importjava.awt.event.*;classGxyextendsThreadimplementsRunnable{Framef=newFrame("OK");TextFieldtext1=newTextField(20),text2=newTextField(20),text3=newTextField(20);doublen=0,正面=0,反面=0,正立=0;Gxy(){f.setLayout(newFlowLayout());f.setSize(200,300);f.setVisible(true);f.add(text1);f.add(text2);f.add(text3);f.validate();f.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});}publicvoidrun(){while(true){n++;doublei=Math.random();if(i<0.5){正面++;text1.setText("正面出现的频率:"+正面/n);}elseif(i==0.5){正立++;text2.setText("正立出现的频率:"+正立/n);}else{反面++;text3.setText("反面出现的频率:"+反面/n);}try{Thread.sleep(200);}catch(Exceptione){}}}}publicclassE{publicstaticvoidmain(Stringargs[]){Threadt=newThread(newGxy());t.start();}}精品资料
/
本文档为【《Java2实用教程》课后习题参考答案】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索