




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java2实用教程(第三版)
课后习题参考答案
第1章JavaAl'l
1.开发与运行Java程序需要经过哪些主要步骤和过程?
答:(1)编写Java源文件:使用文本编辑器(Edit或记事本),拓展名为.java
(2)编译Java源文件:使用Java编译器(javac.exe)o得到字节码文件*.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字节码文件;将得到的字节码文件存放在
C:\5000文件夹下;
③编写小应用程序的HTML源文件:
<appletcode=Boy.classwdith=200height=300codebase=C:\5000></applet>
④将上述编写好的代码命名为Boy.hlml;并将此文件存放在C:\5000文件夹以外的任意一个文件夹中(如
C:\1000);
⑤运行Boy.html。
第2章标识符、关键字和数据类型
1.什么叫标识符?标识符的规则是什么?
答:①用来标识类名、变量名、、方法名、类型名、数组名、文件名的有效字符序列。
②由字母、下划线、美元符号和数字组成,并且第一个字符不能是数字字符,而且关键字不能作为标识符。
2.什么叫关键字?请说出5个关键字。
答:①Java语言中已经被赋予特定意义的一些单词。
②classbreakpublicreturnstaticextends等。
3.Java的基本数据类型都是什么?
答:boolean(逻辑型)char(字符型)float、double(浮点型)byte、short、int、long(整型)°
4.下列明B些语句是错误的:
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.printin("数组b的长度:"+b.length);
System.out.println("'b[0]=*+b[0]);
}
)
答:数组b的长度:4
b[0]=l
6.上机运行下列程序,注意观察输出结果。
publicclassE
(
publicstaticvoidmain(Stringargs[])
for(inti=20302;i<20322;i++)
System,out.print!n((char)i);
)
)
)
答:低住佐佑快体估何他佗余余佚佛作佝佞佟你价
7.System.out.printin("你好");可输出字符串,也可以使用System.out.println()输出变量或表达
式的值,只需使用并置符号“+”将变量、表达式或一个常数值与一个字符串并置即可,如:
System.out.printin(+x);System.out.println(+123+“大于”+122):等。上机调试下列程序,
注意观察结果,特别注意System.out.print()^DSystem.out.printin()的区别。
publicclassOutputData
(
publicstaticvoidmain(Stringargs[])
(
intx=234,y=432;
System.out.printin(x+*<*+(2*x));
System,out.print(“我输出结果后不回车”);
System.out.printing我输出结果后自动回车到卜.一行”);
System,out.println("x+y=”+(x+y));
System,out.printing"+x+y+”=234432");
)
)
答:234<468
我输出结果后不回车我输出结果后自动回车到下一行
x+y=666
234432=234432
8.编写•个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+z,");
)
for(intk=945;k<962;k++)
System,out.print((char)k+z,〃);
for(intt=963;t<=969;t++)
System.out.print((char)t+"");
}
}
}
第3章运算符、表达式和语句
i.下列程序的输出结果是什么?
publicclassE
(
publicstaticvoidmain(Stringargs[])
(
charx='你',y='e',z=吃,;
if(x>'A')
(
y=爱;
z-情;
)
else
y=我';
她';
System,out.printing"+x+y+z);
)
)
答:你爱她
2.下列程序的输出结果是什么?
publicclassE3
(
publicstaticvoidmain(Stringargs[])
(
charc-\0';
for(inti=l;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!o
答:
classFact
(
publicstaticvoidmain(Stringargs[])
(
intfact,SUHFO;
for(inti=l;i<=10;i++)
(
fact=l;
for(intj=l;j<=i;j++)
fact*=j;
sum+=fact;
}
System.out.println("l到10的阶乘之和是:〃+sum);
)
)
4.编写一个应用程序,求100以内的全部素数。
答:
classPrimes
(
publicstaticvoidmain(Stringargs[])
(
intw=l;
for(inti=2:i<=100;i++)
(
for(intj=2;j<i;j++)
(
w=i%j;
if(w==o)
break;
}
if(w!=0)
System.out.println(i+"是素数〃);
}
5.分别用do-while和for循环计算1+1/2!+1/3!+1/4!+…的前20项和。
答:①for循环
classSum
(
publicstaticvoidmain(Stringargs[])
{
intfact;
doublesum=0;
for(inti=l;i<=20;i++)
(
fact=l;
for(intj=l;j<=i;j++)
fact*=j;
sum+=1.0/fact;
)
System,out.println(sum);
}
)
②do-while循环
classSum
(
publicstaticvoidmain(Stringargs[])
(
inti=l;
intfact;
doublesum=0;
do
(
fact=l;
intj=0;
while(++j<=i)
fact*=j;
sum+=1.0/fact;
)
while(++i<=20);
System.out.printin(sum);
)
)
6.,个数如果恰好等于它的因子之和,这个数就称为“完数”。编写应用程序,求1000之内的所有完数。
答:
classWanshu
(
publicstaticvoidmain(Stringargs[])
intx,i,sum;
for(x=l;x<=1000;x++)
sum=O;
for(i=l;i<x;i++)
{
if(x%i==0)
sum+二i;
)
if(x==sum)
System,out.printIn(x+"是完数”);
}
}
)
7.编写应用程序,分别使用while和for循环计算8+88+888+…前10项之和。
答:①for循环
classTheSum
(
publicstaticvoidmain(Stringargs[])
(
1ongsum=0,data=8;
for(inti=l;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+dala;
data=data*10+8;
}
System,out.println(sum);
}
}
8.编写应用程序,输出满足1+2+3+…+n<8888的最大正整数n。
答:
classMaxn
publicstaticvoidmain(Stringargs[])
{
intk=l,sum=0;
while((sum+=k)<8888)
k++;
k-;
System.out.printin(〃最大能取到:〃+k);
}
}
第4章类、对象和接口
i.类中的实例变量在什么时候会被分配内存空间?
答:当该类创建对象之后,实例变量才会被分配相应的内存空间。
2.什么叫方法的重载?构造方法可以重载吗?
答:①一个类中可以有多个方法具有相同的名字,但这些方法的参数必须不同,即或者是参数的个数不同,
或者是参数的类型不同(方法的重载体现了多态性,即功能多态性)。
②构造方法可以重载。
3.类中的实例方法可以操作类变量(static变量)吗?类方法(static方法)可以操作实例变量吗?
答:①类中的实例方法可以操作类变量。
②类方法不可以操作实例变量
4.类中的实例方法可以用类名直接调用吗?
答:类中的实例方法不可以用类名直接调用。
5.举例说明protected方法和友好方法的区别。
答:当子类与父类不在同•个包中时,子类可以继承父类的protected方法;而友好方法此时则不能被子类
继承。
6.举例说明类变量和实例变量的区别»
答:⑴书写:定义成员变量时,类变量有static修饰:实例变量没有static修饰。
例:classA
(
intx;〃实例变量
staticinty;〃类变量
}
⑵内存:不创建对象,类的实例变量不会被分配内存空间;类变量被分配相应的内存空间。
不同对象的实例变量被分配不同的内存空间;不同对象的类变量被分配相同的内存空间。
任何一个对象改变类变量,其他对象的相应类变量也发生相应变化。
•个对象的实例变量发生改变,不影响其他对象的相应实例变量。
例:执行语句:Al,x=10;Al.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的上转型对象。
1L什么叫接口的回调?
答:可以把实现某一接口的类创建的对象的引用赋给该接口声明的接口变量中。
12.卜.列程序有什么错误?
publicclassTakecare
inta=90;
staticfloatb=10.98f;
publicstaticvoidmain(Stringargs[])
(
floatc=a+b;
System.out.println("c=〃+c);
)
}
答:语句floalc=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);
)
)
答:100
14.请写出下列程序的输出结果。
classA
intx;
publicvoidsetX(intx)
this.x=x;
)
intgetXO
returnx;
)
)
classB
(
publicvoidf(Aa)
(
a.setX(lOO);
)
)
publicclassE
(
publicstaticvoidmain(Stringargs[])
(
Aa=newA();
a.setX(8);
System.out.println(a.getX0);
Bb=newB();
b.f(a);
System.out.print1n(a.getXO);
)
)
答:8
100
15.使用接口有।那些注意事项?模仿例了427,编写个类实现两个接口的程序。
答:①•个类使用接口时,要有implements关键字,当•个类使用多个接口时,接口名要用逗号“,”隔开;
使用接口的类除abstract类外,必须实现接口的所有方法,并且实现接口的方法时,方法名字、返回类型、
参数个数及类型必须与接口中的完全一致;类在实现接口时,方法体一定要用public修饰,如果接口方法
的返回类型不是void型,在类中实现接口时,方法体至少有一个retuim语句。
②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.printin("半径为5的球的表面积是:"+a.allArea(r));
System.out.printin("半径为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.printlnC7");
}
)
classBextendsA
(
inti;
voidg()
for(i=913;i<930;i++)
System,out.print((char)i+z,〃);
for(i=931;i<938;i++)
System.out.print((char)i+/z");
for(i=945;i<962;i++)
System.out.print((char)i+,z");
for(i=963;i<970;i++)
System,out.print((char)i+"");
System,out.printIn(〃〃);
)
}
publicclassTest
(
publicstaticvoidmain(Stringargs[])
(
Bb=newB();
System.out.printin(“我调用方法f输出英文字母表:〃);
b.f0;
System.out.printin(“我调用方法g输出希腊字母表:〃);
b.g();
}
}
17.编写个异常类MyExccption,再编写•个类Student,该类有•个产生异常的方法publicvoid
speak(intm)throwsMyException,要求参数m的值大于1000时,方法抛出一个MyException对象。最后编
写主类,在主类的main方法用Student创建一个对象,让该对象调用speak方法。
答:classMyExceptionextendsException
(
Stringstrl;
MyException(intm)
(
strl初+〃出现错误可能造成的原因是取值大于1000〃;
)
publicvoidshowStri()
(
System.out.println(strl);
)
}
classStudent
publicvoidspeak(intm)throwsMyException
if(m>1000)
MyExceptionexception=newMyException(m);
throwexception;
)
else
System,out.println(m);
)
}
publicclassTest
publicstaticvoidmain(Stringagrs[])
(
intm;
Studentstul=newStudent();
m=987;
try
(
stul.speak(m);
m=1234;
stul.speak(m);
}
catch(MyExceptione)
(
e.showStr1();
}
}
)
18.编写•个类,该类有•个方法publicintf(inta,intb),该方法返回a和b的最大公约数。然后再编
写一个该类的子类,要求子类重写方法3而且重写的方法将返回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.prinlln(〃18和102的最大公约数是:"+a.f(18,102));
Bb=newB();
System,out.println(“18和102的最小公倍数是:"+b.f(18,102));
)
}
第5章字符串
1.使用String类的publicStringtoUppcrCaseO方法可以将一个字符串中的小写字母变成大写字母,使
用publicStringtoLowerCaseO方法可以将•个字符串中的大写字母变成小写字母。编写•个程序,使用
这两个方法实现大小写的转换。
答:classTest
publicstaticvoidmain(Stringargs[])
Sti'ingstr二〃IcanuseJava”;
System.out.printin(〃要转换的字符串是:〃+str);
Strings=str.toUpperCaseO;
System.out.printin("转换成大写字符串是:〃+s);
s=sir.toLowerCase();
System.out.printin("转换成小写字符串是:"+s);
}
)
2.使用String类的publicStringconcat(Stringstr)方法可以把调用该方法的字符串与参数指定的字符
串连接,把str指定的串连接到当前串的尾部获得一个新的串。编写一个程序通过连接两个串得到一个新串,
并输出这个新申。
答:classTest
(
publicstaticvoidmain(Stringargs[])
(
Stringstrl="Icanu”;
Stringstr2="seJava”;
Strings=strl.concat(str2);
System.out.printin(〃将字符串〃+strl+〃与字符串"+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(double
a口,intstart,intend)可以把参数a指定的double型数组中从位置start到endT位置的数按升序排序。写
出下列程序的输出结果。
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]+/z,z/);
)
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[])
(
charal□二=
System,arraycopy(al,0,bl,1,al.Iength~l);
System.out.print1n(newString(al));
System,out.println(newString(bl));
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.printIn(newString(a2));
System,out.printIn(newString(b2));
)
)
答:①运行结果:abedef
labede
abcACD
ACDEFG
②arraycopy的方法是publicstaticvoidarraycopy(Objectsre,intsrcPos,Objectdest,intdestPos,
intlength)o其中五个参数分别表示:
sre-被复制的数组
srcPos-从第几个元素开始复制
dest-要复制到的数组
destPos-从第儿个元素开始粘贴
length--共需要复制的元素个数
第6章时间、n期和数字
1.用Data类不带参数的构造方法创建日期,要求日期的输出格式是:星期小时分秒。
答:importjava,uti1.*;
importjava.text.
classTest
{
publicstaticvoidmain(Stringargs[])
(
Date时间二newDate();
Simp1eDateFormats=newSimpleDateFormat(Z/EHH时mm分ss秒〃);
System.out.println(s.format(时间));
)
}
2.输出2006年2月的日历页,程序需处理闰年问题。
答:importjava.util.*;
classTest
{
publicstaticvoidmain(Stringargs[1)
intyear=2006,month=2;
inta11Day;
if((year%4==0&&year%l00!=0)||(year%400==0))
allDay=29;
else
allDay=28;
Calendarfeb=Calendar.getInstance();
feb.set(2006,1,1);
intdat=feb.get(Calendar.DAY_OE_WEEK)-1;
Stringa[]=newString[dat+allDay];
for(inti=0;i<dat;i++)
{
a[i]=〃〃;
}
for(inti=dat,n=l;i<(dat+alIDay);i++)
{
if(n<=9)
a[i]=String.valueOf(n)+zz;
else
a[i]=String.valueOf(n)+*
n++;
)
System,out.printlnCz'+year+〃年”+month+“月”);
System.out.printin("日一二三四五六”);
for(intj=O:j<a.length;j++)
(
if(j%7==0)
(
System,out.printlnC^〃);
)
System,out.print(a[j]);
)
)
)
3.计算某年、某月、某11和某年、某月、某II之间的天数间隔。要求年、月、II通过main方法的参数传递
到程序中。
答:importjava,util.*;
classTest
(
publicstaticvoidmain(Stringargs[])
(
Calendarc=Calendar.getlnstance0;
c.set(2000,0,1);
longtimel=c.getTimelnMillisO;
c.set(2008,7,8);
longtime2=c.getTimelnMillisO;
longdayCous=(time2-timel)/(1000*60*60*24);
System.out.println("2008年8月8日和2000年l月l日相隔〃+dayCous+"天”);
)
)
4.编程练习Math类的常用方法。
答:importjava.text.*;
publicclassTest
{
publicstaticvoidmain(Stringargs[])
(
doublea=Math.abs(-10);
System,out.println("T0的绝对值是:"+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(,z123.456与-5.4321中的最小值是:“+minNum);
intrandomNum=(int)(Math,random()*10)+1;
System.out.printin(〃输出一个1到10的随机数是:"+randomNuni);
doublepowNum=Math.pow(2,10);
System,out.prinlln("2的10次事是:"+powNum);
doublesqrtNum=Math.sqrt(10);
System,out.printin("10的平方根是:"+sqrtNum);
doublelogNum=Math.log(2);
System.out.p「intln(〃2的对数是:〃+logNum);
doublesinNum=Math.sin(-10);
System,out.printIn("TO的正弦值是:“+sinNum);
doubleasinNum=Math.asin(0.5);
System,out.println(,z0.5的反正弦值是:“+asinNum);
System.out.printin(〃格式化之前的数是:〃+sqrtNum);
NumberFormatf=NumberFormat,getInstance0;
f.setMaximumFractionDigits(lO);
f.setMinimumlntegerDigits(4);
Strings=f.format(sqrtNum);
System.out.printin(“格式化后:〃+s);
)
)
5.使用Biginteger类计算1!+3!+5!+7!+…的前30项的和。
答:importjava.math.*;
publicclassTest
(
publicstaticvoidmain(Stringargs[])
Bigintegersum=newBiglnleger("0"),
jieCheng=newBiglnteger(“1〃),
ONE二newBiglnteger(z,l/z),
i=0NE;
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.printIn(sum);
}
第7章AWT组件及事件处理
1.Frame类对象的默认布局是什么布局?和Panel类对象的默认布局相同吗?
答:①Frame类对象的默认布局是BorderLayoul布局;
②不相同,Pane1类对象的默认布局是Flowl^yout布局。
2.一个容器对象是否可以使用add方法添加一个Frame窗口?
答:不可以。
3.Checkbox对象可以触发11emEvent事件吗?
答:可以。
4.编写应用程序,有一个标题为“计算的窗口”的窗口,窗口的布局为FlowLayoul布局。窗口中添加两个
文本区,当我们在•个文本区中输入若干个数时,另•个文本区,同时对输入的数进行求和运算并求出平
均值,也就是说随着输入的变化,另一个文本区不断地更新求和及平均值。
答:importjava.awt.*;
importjava.awt.event.*;
importjava.util.*;
classCalculatedextendsFrameimplementsTextListener
(
TextAreatextl,text2;〃定义了2个文本区
CalculatecKStrings)〃标题为“计算的窗口”的窗口
(
super(s);
setLayout(newFlowLayout());//窗口布局为FlowLayout
textl=newTextArea(5,23);
text2=newTextArea(5,23);
add(textl);
add(text2);
text2.setEditable(false);〃显示求和结果和平均值的文本区禁止编辑
textl.addTextListener(this);
addWindowListener(newWindowAdapter()
(
publicvoidwindowC1osing(WindowEvente)
(
System,exit(0);
}
)
);
setBounds(100,100,400,160);
setVisible(true);
validateO;
}
publicvoidtextValueChanged(TextEvente)
(
Strings=textl.getText();
StringTokenizergeshu=newStringTokenizer(s);
intn=geshu.countTokens();
doublea[]=newdouble[n];
for(inti=0;i<n;i++)
(
Stringtemp=geshu.nextTokenO;
doubledate=Double.parseDouble(temp);
a[i]=dale;
)
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.文本区可以使用getSelectedTextO方法获取该文本区通过拖动鼠标选中的文件。编写应用程序,有
个标题为“挑单词”的窗口,窗口的布局为BorderLayout布局。窗口中添加两个文本去和一个按钮组
件,要求文本区分别添加到窗口的东部区域和西部区域;按钮添加到窗口的南部区域,当单击按钮时,程
序将东部区域的文本区中鼠标选中的内容尾加到西部区域的文本区中。
答:importjava.awt.*;
importjava.awt.event.*;
classWindowSelectedTextextendsFrameimplementsActionListener
(
TextAreatextl,text2;〃定义2个文本区
Buttonbutton;〃定义一个按钮
WindowSelectedText(Strings)〃窗口名字为"挑单词"
super(s);
setLayout(newBorderLayout0);〃窗口布局是BorderLayout布局
textl=newTextArea(6,15);
text2=newTextArea(6,15);
button=newButton("确定");
add(textl,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=textl.getSelectedText()+zz\nz,;
Stringstr=text2.getText();
text2.setText(str+s);
)
}
)
publicclassTest
publicstaticvoidmain(Stringargs[])
{
newWindowSelectedText("挑单词");
}
}
6.编写一个应用程序,有一个标题为“计算”的窗口,窗口的布局为FlowLayout布局。设计4个按钮,分
别命名为“加”、“差”、“积”、“除“,另外,窗口中还有3个文本框。单击相应的按钮,将两个文本
框的数字做运算,在第三个文本框中显示结果。要求处理NumberFormatException。
答:importjava.awt.*;
importjava.awt.event.*;
classCalculatedextendsFrameimplementsActionListener
(
TextFieldtextl,text2,text3;〃3个文本框
ButtonbuttonH,buttonC,buttonJ,buttons;〃4个按钮
Calculated(Strings)
(
super(s);
setLayout(newFlowLayout());〃FlowLayout布局
textl=newTextField(10);
text2=newTextField(10);
text3=newTextField(17);
buttonH=newButton("加〃);
buttonC=newButton(〃差〃);
buttonj=newButton(〃积”);
buttonS二newButton("除“);
add(textl);
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)
doublenuml=0,num2=0,totle=0;
try
(
numl=Double.parseDouble(text1.getText());
num2=Double.parseDouble(text2.getText());
if(e.getSource()==buttonH)
{
totle=numl+num2;
text3.setText(〃和“+totle);
}
elseif(e.getSource()-buttonC)
(
totle=numl-num2;
text3.setText(〃差"+totle);
)
elseif(e.getSource()=buttonj)
{
tot1e=num1*num2;
text3.setText("积"+totle);
)
elseif(e.getSource()=buttonS)
(
totle=numl/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
{
TextFieldtextl,text2,text3;
TextAreatextarea;
BoxbaseBox,boxVl,boxV2;
Buttonbutton;
WindowBox()
(
button=newButton(〃确定”);
textarea=newTextArea(6,12);
textl=newTextField(12);
text2=newTextField(12);
text3=newTextField(12);
boxVl=Box.createVerticalBox();
boxVI.add(newLabel("姓名”));
boxVI.add(Box.createVerticalStrut(8));
boxVI.add(newLabel("email"));
boxVl.add(Box.createVerticalStrut(8));
boxVl.add(newLabel(〃职业”));
boxV2=Box.createVerticalBox();
boxV2.add(textl);
boxV2.add(Box.createVerticalStrut(8));
boxV2.add(text2);
boxV2.add(Box.createVerticalStrut(8));
boxV2.add(text3);
baseBox=Box.createllorizonta1Box0;
baseBox.add(boxVl);
baseBox.add(Box.createHorizontalStrut(10));
baseBox.add(boxV2);
setLayout(newFlowLayout());
add(baseBox);
add(button);
add(textarea);
acldWindowListener(newWindowAdapter0
(
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)
(
Stringstrl=textl.getText0+/z\n,/+text2.getText()+,,\n,,+text3.getText
Stringstr2=textarea.getText();
textarea.setText(str2+strl);
}
else
(
text2.setText(〃输入了非法格式的E-mail地址”);
}
}
)
}
publicclassTest
(
publicstaticvoidmain(Stringargs[])
{
newWindowBox();
)
8.写一个应用程序,要求编写一个Panel的子类MyPanel,MyPane1rti有一个文本框和一个按钮,要求MyPanel
的实例作为其按钮的ActionEvenl事件的监视器,当单击按钮时,程序获取文本框中的文本,
并将该文本作为按钮的名称。然后在编写•个Frame的子类,即窗口。窗口的布局为BorderLayout布局。窗
口中添加两个MyPanel面板,分别添加到窗口的东部区域和西部区域。
答:importjava.awt.*;
importjava.awt.event.*;
classMyPanelextendsPanelimplementsActionListener
(
Stringname;
TextFieldtext;
Buttonbutton;
MyPanel()
(
text=newTextField(lO);
button二newButton(“确定");
add(text);
add(button);
button.addActionListener(this);
addWindowListener(newWindowAdapter()
{
publicvoidwindowClosing(WindowEvente)
(
System,exit(0);
)
)
);
}
publicvoidactionPerformed(ActionEvente)
(
if(e.getSource()==bu11on)
(
name=text.getText();
button.setLabel(name);
)
)
)
classMyFrameextendsFrame
{
MyPanelpanel1,panel2;
MyFrame()
(
panell=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;
Mycanvas0
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;
TextFieldtextl,text2,text3,text4;
Buttonbutton;
WindowCanvas()
(
canvas=newMycanvas();
textl=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()
(
publicvoidwindowC1osing(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.parselnt(text1.getText());
y二Integer.parselnt(text2.getText());
w=Integer.parselnt(text3.getText());
h二Integer,parselnt(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.编写应用程序,有一个窗口对象,该窗口取它的默认布局:BorderLayoul布局,北面添加一个Lisi组件,
该组件有四个商品名称的选项。中心添加♦个文本区,当选择List组件中的某个选项后,文本区显示对该
商品的价格和产地:当双击List组件中的某个选项后,文本区显示该商品的详细广告。
答:importjava.awt.
importjava.awt.eve
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 古文明遗产解读
- 几何图形解密
- 物业消防安全教育培训
- 膀胱冲洗的护理要点
- 2024-2025学年人教版高一化学必修第二册教学课件 8.1.2煤、石油和天然气的综合利用
- 手绘教育培训总结计划
- 校本研修汇报材料1
- 互助铺子转让合同范例
- fangwu追加合同范例
- 创意美术水杯课件
- 2024年北京市重点建设项目政府投资计划项目
- 金属冶炼安全事故案例与分析
- 《柯高峰行政监察学》课件
- 2024城市道路路面维修养护技术规程
- 老年糖尿病夜间低血糖的预防及护理
- 梅毒病人产后护理查房
- 小班-语言社会-幸福的“叮咚”-课件(基础版)公开课教案教学设计课件案例试卷
- 专业培训金蝶k3wise供应链系统培训
- 办公耗材采购 投标方案(技术方案)
- 《干部履历表》填写样式
- 汽车电气设备检测与维修中职全套教学课件
评论
0/150
提交评论