还剩64页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
参考答案第1章1.Java语言有哪些主要特点平台独立性安全性多线程网络化面向对象2.目前美国Sun公司提供的适用不同开发规模的JDK有哪些目前Sun共提供了三种不同的版本微平台版J2ME(Java2PlatformMicroEdition),标准版J2SE(Java2PlatformStandardEdition)和企业版J2EE(Java2PlatformEnterpriseEdition),这三种版本分别适用于不同的开发规模和类型,对于普通Java开发人员和一般学习者来说,选用标准版J2SE就可以了,学会了J2SE,再学J2ME或J2EE就比较容易上手,因为它们之间虽有所侧重,但相似之处很多,尤其是语言本身是一样的,都是Java3.JavaApplication的开发步骤有哪些JavaApplication的开发步骤
(1)下载JDK软件并安装;
(2)配置相应的环境变量(path和classpath);
(3)编写Java源程序(文本编辑器或集成开发环境IDE);
(4)编译Java源程序,得到字节码文件(javac*.java);
(5)执行字节码文件(java字节码文件名)4.什么是环境变量,设置环境变量的主要目的是什么环境变量的配置主要是为了进行“寻径”,也即让程序能找到它需要的文件,所以设置的内容就是一些路径5.不参考书本,试着编写一个简单的JavaApplication程序,实现在Dos窗口输出“WelcometoNanjingCity!”字符串并对该程序进行编译和运行publicclassHello{publicstaticvoidmainStringargs[]{WelcometoNanjingCity!;}}6.编写一个JavaApplication程序,实现分行显示字符串“WelcometoNanjingCity”中的四个单词publicclassHello{publicstaticvoidmainStringargs[]{Welcome;to;Nanjing;City!;}}第2章1.Java语言对于合法标识符的规定是什么?指出以下哪些为合法标识符aa23a*a_a$ainta%在Java语言中,标识符必须以字母、美元符号或者下划线打头,后接字母、数字、下划线或美元符号串另外,Java语言对标识符的有效字符个数不做限定合法的标识符aa2_a$a2.变量的涵义是什么?变量名与变量值的关系?在程序执行过程中其值可以改变的数据,称为变量,它本质上代表了内存中的一小块空间每个变量都必须有对应的名称来标识它,即变量名,而变量空间所存放的数据则称为变量值3.Java语言提供哪些基本的数据类型,为什么要提供这些不同的数据类型?布尔型boolean整型byte、short、int以及long浮点型(实型)float以及double字符型char数据类型代表了数据的存储格式和处理方式,虽然严格来说计算机只能识别“0”和“1”,但是,有了数据类型以后,计算机的识别能力就被人为扩展了,它能够识别整数、实数以及字符等4.赋值语句的涵义是什么数据传递5.数据类型强制转换的原则是什么?如何转换?对于变窄转换,如long到short、double到float,或者不兼容转换float到short、char到short等,则需要进行强制转换floatf=
11.5;shortb;b=(short)f;(强制转换)6.每一条程序语句都应以分号来结束,这个分号能否用中文输入模式下输入的分号,为什么?不能首先中英文输入模式下输入的分号是不同的,不但外观不同,其存储所需的空间也是不同的,Java编译器只能识别英文的分号,对于中文分号,将会报错第3章1.假定乘坐飞机时,每位顾客可以免费托运20kg以内的行李,超过部分按每公斤收费
1.2元,以下是相应的计算收费程序该程序存在错误,请找出publicclassTest{publicstaticvoidmainString[]argsthrowsIOException{floatwfee;//以下代码为通过控制台交互输入行李重量InputStreamReaderreader=newInputStreamReaderSystem.in;BufferedReaderinput=newBufferedReaderreader;Stringtemp=input.readLine;w=Float.parseFloattemp;//字符串转换为单精度浮点型fee=0;ifw20;fee=float
1.2*w-20;}}缺少语句2.有一条长的阶梯,如果每步2阶,则最后剩1阶,每步3阶则剩2阶,每步5阶则剩4阶,每步6阶则剩5阶,只有每步7阶的最后才刚好走完,一阶不剩,问这条阶梯最少共有多少阶?找出以下求解程序的错误所在publicclassTest{publicstaticvoidmainString[]args{inti;whilei%2==1i%3==2i%5==4i%6==5i%7==0{i++;}}}1)变量i应进行初始化2)while循环的条件表达式应再加上“非”,这样才符合逻辑3.试用单分支结构设计一判断用户输入值X,当X大于零时求X值平方根,否则不执行任何操作的程序publicclassTest{publicstaticvoidmainString[]argsthrowsIOException{floatx;InputStreamReaderreader=newInputStreamReaderSystem.in;BufferedReaderinput=newBufferedReaderreader;Stringtemp=input.readLine;x=Float.parseFloattemp;//字符串转换为单精度浮点型ifx0}}4.从键盘读入两个字符,按照字母表排序顺序,将前面的字符置于A,排后面的字符置于B请设计实现该程序publicclassTest{publicstaticvoidmainString[]argsthrowsIOException{charABc1c2;ifc1c2{A=c2;B=c1;}else{A=c1;B=c2;}}}5.用穷举法求出3位数中百、
十、个位数的立方和就是该数的数publicclassTest{publicstaticvoidmainString[]args{intabcx=100;whilex1000{a=x%10;b=x%100-a/10;c=x-x%100/100;ifa*a*a+b*b*b+c*c*c==xx+=1;}}}6.编程实现打印以下图案************************************publicclassTest{publicstaticvoidmainString[]args{intijk;//i控制行数k控制*的个数j控制空格数fori=1;i=6;i++{forj=1;j=i-1;j++fork=1;k=13-i*2;k++}}}7.统计1至1万共有多少个数是素数publicclassTest{publicstaticvoidmainString[]args{intijcount=0;label:fori=1;i=10000;i++//查找1到10000以内的素数{forj=2;ji;j++//检验是否不满足素数条件ifi%j==0//不满足continuelabel;//跳过后面不必要的检验count++;//计数}}}8.打印输出斐波纳契数列的前12项斐波纳契数列的前12项如下第1项0第2项1第3项1第4项2第5项3第6项5第7项8第8项13第9项21第10项34第11项55第12项89publicclassTest{publicstaticvoidmainString[]args{inti=0j=1;forintk=0;k6;k++{i=i+j;j=i+j;}}}9.读程序,写结果publicclassTest{publicstaticvoidmainString[]argsthrowsIOException{charsex=f;switchsex{break;}}}女性未知10.读程序,写结果publicclassTest{publicstaticvoidmainString[]args{intis=0;fori=1;i=100;i++{ifi%3==0continue;s+=i;}}}s=336711.读程序,写结果publicclassTest{publicstaticvoidmainString[]args{intis=0;fori=1;i=100;i++{s+=i;ifs100break;}}}s=10512.个位数是6,且能被3整除的5位数有多少?publicclassTest{publicstaticvoidmainString[]args{inti=10006count=0;whilei100000{ifi%3==0count++;i+=10;}}}13.用嵌套循环结构,设计一模拟电子钟的程序提示定义三个变量分别代表“小时”、“分”和“秒”,根据电子钟分、秒、小时之间的关系,采用三重循环来控制各量的增加,并由输出语句将变化中的三个量分别予以输出显示,即为一模拟数字电子钟此外,Java语言提供的延时方法为Thread.sleep1000;1000的单位为毫秒,即延时1秒publicclassTest{publicstaticvoidmainString[]argsthrowsInterruptedException{inthour=12min=0sec=0;whilehour24{whilemin60{whilesec60{sec++;Thread.sleep1000;}sec=0;min++;}min=0;hour++;}}}第4章1.以下叙述中不正确的是______A、在方法中通过return语句传回方法值B、在一个方法中,可以执行有多条return语句,并返回多个值C、在Java中主方法main()后的一对圆括号中也可以带有参数D、在Java中B2.以下正确的描述是______A、方法的定义不可以嵌套,但方法的调用可以嵌套B、方法的定义可以嵌套,但方法的调用不可以嵌套C、方法的定义和方法的调用均不可以嵌套D、方法的定义和方法的调用均可以嵌套A3.以下正确的说法为______A、在不同方法中不可以使用相同名字的变量B、实际参数可以在被调方法中直接使用C、在方法内定义的任何变量只在本方法范围内有效D、在方法内的复合语句中定义的变量只在本方法语句范围内有效C4.按Java语言的规定,以下正确的说法是______A、实参不可以是常量,变量或表达式B、形参不可以是常量,变量或表达式C、实参与其对应的形参占用同一个存储单元D、形参是虚拟的,不占用存储单元D5.一个JavaApplication程序中有且只有一个方法,它是整个程序的执行入口main()方法6.方法通常可以认为由两部分组成,它们是和方法头和方法体7.读程序写结果publicclassTest{ staticvoidmintxintyintz {x=111;y=222;z=333; } publicstaticvoidmainStringargs[] {intx=100y=200z=300; mxyz;“x=”+x+”y=”+y+”z=”+z; }}x=100y=200z=3008.编写一个判断某个整数是否为素数的方法publicbooleanprimeintx{forintj=2;jx;j++//检验是否满足素数条件ifx%j==0//不满足returnfalse;returntrue;}9.编写两个方法,分别求两个整数的最大公约数和最小公倍数,在主方法中由键盘输入两个整数并调用这两个方法,最后输出相应的结果publicclassTest{publicstaticvoidmainString[]args{inta=0;try{BufferedReaderbr=newBufferedReadernewInputStreamReaderSystem.in;a=Integer.parseIntbr.readLine;}catchIOExceptione{}intb=0;try{BufferedReaderbr=newBufferedReadernewInputStreamReaderSystem.in;b=Integer.parseIntbr.readLine;}catchIOExceptione{}ifa=0||b=0}publicstaticintGysintaintb{intr=0;ifab{r=a;b=a;a=r;}inti=1;whilei!=0{i=a%b;a=b;b=i;}returna;}publicstaticintGbsintaintb{intab=a*b;intr=0;ifab{r=a;b=a;a=r;}inti=1;whilei!=0{i=a%b;a=b;b=i;}returnab/a;}}10.以下程序执行后的输出为publicclassTest{staticintm1intaintb{intc;a+=a;b+=b;c=m2ab;returnc*c;}staticintm2intaintb{intc;c=a*b%3;returnc;}publicstaticvoidmainString[]args{intx=1y=3z;z=m1xy;}}z=011.编写一个方法,实现求某整数的各位数字之和的功能publicclassTest{publicstaticvoidmainString[]args{intia=0s=0;try{BufferedReaderbr=newBufferedReadernewInputStreamReaderSystem.in;a=Integer.parseIntbr.readLine;}catchIOExceptione{}fori=10;a%i!=a;i*=10{s+=a%i/i/10;}s+=a/i/10;}}12.编写完成十进制整数到八进制的转换方法publicclassTest{publicstaticvoidmainString[]args{intika=0ds=0;try{BufferedReaderbr=newBufferedReadernewInputStreamReaderSystem.in;a=Integer.parseIntbr.readLine;}catchIOExceptione{}d=a%8;s+=d;k=10;fori=64;a-d!=0;i*=8{s+=a-d%i*8/i*k;k*=10;d=a%i;}}}13.用于指出数组中某个元素的数字被叫做;数组元素之所以相关,是因为它们具有相同的和下标;数组名和数据类型14.数组intresults[]=newint
[6]所占存储空间是字节2415.使用两个下标的数组被称为数组,假定有如下语句floatscores[][]={{1,2,3},{4,5},{6,7,8,9}};则scores.length的值为,scores
[1].length的值为,scores
[1]
[1]的值为二维;3;2;516.从键盘上输入10个双精度浮点数后,求出这10个数的和以及它们的平均值要求分别编写相应求和及求平均值的方法publicclassTest{publicstaticvoidmainString[]argsthrowsIOException{InputStreamReaderreader=newInputStreamReaderSystem.in;BufferedReaderinput=newBufferedReaderreader;Stringtemp;doublex[]=newdouble
[10];forinti=0;i10;i++{temp=input.readLine;x[i]=Double.parseDoubletemp;}Sx;Avgx;}publicstaticvoidSdoublex[]{//计算并输出和doublesum=0;forinti=0;i10;i++{sum+=x[i];}}publicstaticvoidAvgdoublex[]{//计算并输出平均数doublesum=0;forinti=0;i10;i++{sum+=x[i];}+sum/10;}}17.利用数组输入6位大学生3门课程的成绩,然后计算
(1)每个大学生的总分;
(2)每门课程的平均分;publicclassScores{publicstaticvoidmainString[]argsthrowsIOException{intsum=0;//总分InputStreamReaderreader=newInputStreamReaderSystem.in;BufferedReaderinput=newBufferedReaderreader;intx[][]=newint
[6]
1.java文件中 现在main方法所在的源程序MainPro.java如下importmypackage;hellip;hellip;假设操作系统中的CLASSPATH环境变量已被设成c:\java\lib\classes.zip;.;,而main方法所在的源程序MainPro.java存在目录c:\mydir中(当前工作目录为c:\mydir),那么Class
1.class文件应存放在那个目录中呢?_________答案c:\mydir\mypackage7.定义一个表示学生的类student,成员变量有学号、姓名、性别、年龄,方法有获得学号、姓名、性别、年龄;修改年龄书写Java程序创建student类的对象及测试其方法的功能答publicclassstudent{privateintstu_ID;privateStringname;privateStringsex;privateintold;studentintidStringnameStringsexintold{stu_ID=id;this.name=name;this.sex=sex;this.old=old;}voidshow_id{}voidshow_name{}voidshow_sex{}voidshow_old{}voidchange_oldintnewyear{old=newyear;}publicstaticvoidmainStringargs[]{studentLee=newstudent2007070130LiMingM18;Lee.show_id;Lee.show_name;Lee.show_sex;Lee.show_old;Lee.change_old20;Lee.show_old;}}8.根据下面的要求编程实现复数类Complex1复数类Complex的属性real代表复数的实数部分imagin代表复数的虚数部分2复数类Complex的方法Complex构造函数,将实部、虚部都置为0;Complexdoublerdoublei构造函数,创建复数对象的同时完成复数的实部、虚部的初始化,r为实部的初值,i为虚部的初值;getReal获得复数对象的实部;getImagin获得复数对象的虚部;complexAddComplexNumber当前复数对象与形参复数对象相加,所得的结果也是复数值,返回给此方法的调用者;complexMinusComplexNumber当前复数对象与形参复数对象相减,所得的结果也是复数值,返回给此方法的调用者;complexMultiComplexNumber当前复数对象与形参复数对象相乘,所得的结果也是复数值,返回给此方法的调用者;toString把当前复数对象的实部、虚部组合成a+bi的字符串形式,其中a和b分别为实部和虚部的数据答案publicclassComplex{privatedoublereal;privatedoubleimagin;Complex{real=0;imagin=0;}Complexdoublerdoublei{real=r;imagin=i;}publicdoublegetReal{returnreal;}publicdoublegetImagin{returnimagin;}publicComplexcomplexAddComplexNumber{real=real+Number.real;imagin=imagin+Number.imagin;returnthis;}publicComplexcomplexMinusComplexNumber{real=real-Number.real;imagin=imagin-Number.imagin;returnthis;}publicComplexcomplexMultiComplexNumber{real=real*Number.real;imagin=imagin*Number.imagin;returnthis;}publicvoidtostring{}publicstaticvoidmainStringargs[]{Complexa=newComplex;Complexb=newComplex34;Complexc=newComplex23;a.tostring;b.tostring;c.complexAddb;c.tostring;}}第6章1.B2.C3.接口中可以有的语句为____;(从ABCD中多选)一个类可以继承____父类,实现____接口;一个接口可继承____接口;(从EF中单选)接口____继承父类,____实现其它接口;实现某个接口的类____当作该接口类型使用;(从GH中单选)(A)intx;(B)inty=0;(C)publicvoidaa;(E)仅一个(F)一个或多个(G)可以(H)不可以答案BC;E;F;F;H;H;G4.解释this和super的意义和作用答Java中,this用来引用当前对象,与this类似,super用来引用当前对象的父类5.什么是继承?继承的意义?如何定义继承关系?答继承是一种由已有的类创建新类的机制通过继承可以实现代码的复用,使程序的复杂性线性地增长,而不是随规模增大呈几何级数增长由于父类代表了所有子类的共性,而子类既可继承其父类的共性,又可以具有本身独特的个性,在定义子类时,只要定义它本身所特有的属性与方法就可以了6.什么是多态?Java程序如何实现多态?有哪些实现方式?答多态性是指同名的不同方法在程序中共存即为同一个方法定义几个版本,运行时根据不同情况执行不同的版本调用者只需使用同一个方法名,系统会根据不同情况,调用相应的不同方法,从而实现不同的功能多态性又被称为“一个名字,多个方法”多态性的实现有两种方式覆盖实现多态性、重载实现多态性7.利用多态性编程,实现求三角形、正方形和圆形面积方法抽象出一个共享父类,定义一函数为求面积的公共界面,再重新定义各形状的求面积函数在主类中创建不同类的对象,并求得不同形状的面积答利用多态性编程,实现求三角形、正方形和圆形面积方法抽象出一个共享父类,定义一函数为求面积的公共界面,再重新定义各形状的求面积函数在主类中创建不同类的对象,并求得不同形状的面积abstractclassShape{abstractfloatarea;}classCircleextendsShape{publicfloatr;Circlefloatr{this.r=r;}publicfloatarea{return
3.14*r*r;}}classRectangleextendsShape{publicfloatwidthheight;Rectanglefloatwfloath{width=w;height=h;}publicfloatarea{returnwidth*height;}}第7章1.String类型与StringBuffer类型的区别是什么?答String类型的字符串是对原字符串的拷贝进行操作,而StringBuffer类型的字符串是对原字符串本身进行操作的,操作后的结果会使原字符串发生改变2.有如下四个字符串s
1、s
2、s3和s4:Strings1=HelloWorld!;Strings2=newStringHelloWorld!;s3=s1;s4=s2;求下列表达式的结果是什么?s1==s3s3==s4s1==s2s
1.equalss2s
1.compareTos2答下列表达式的结果是falsefalsefalsetrue03.下面程序输出的结果是什么?publicclassTest{publicstaticvoidmainString[]args{Strings1=Ilikecat;StringBuffersb1=newStringBufferItisJava;Strings2;StringBuffersb2;s2=s
1.replaceAllcatdog;sb2=sb
1.delete24;System.out.printlns1为+s1;System.out.printlns2为+s2;System.out.printlnsb1为+s1;System.out.printlnsb2为+s2;}}答程序的输出结果为s1为Ilikecats2为Ilikedogsb1为Ilikecatsb2为Ilikedog4.设s1和s2为String类型的字符串,s3和s4为StringBuffer类型的字符串,下列那个语句或表达式不正确?s1=HelloWorld!;s3=HelloWorld!;Strings5=s1+s2;StringBuffers6=s3+s4;Strings5=s1-s2;s1=s2charc=s
1.charAts
2.length;s
4.setCharAts
4.lengthy;答语句或表达式不正确的有s3=HelloWorld!;StringBuffers6=s3+s4;Strings5=s1-s2;s1=s25.StringTokenizer类的主要用途是什么?该类有哪几种重要的方法?它们的功能是什么?答StringTokenizer类的主要用途是可以通过分析一个字符串把字符串分解成可被独立使用的单词常用的方法有如下几种publicStringnextToken;功能逐个获取字符串中的单词并返回该字符串publicStringnextTokenStringdelim功能以delim作为分隔符逐个获取字符串中的单词并返回该字符串publicintcountTokens功能返回单词计数器的publicbooleanhasMoreTokens;功能检测字符串中是否还有单词,如果还有单词,则返回true,否则返回false6.下列程序输出的结果是什么?importpublicclassHello{publicstaticvoidmainString[]args{Strings=Friday;Saturday\SundayMondayTuesday;StringTokenizerstk=newStringTokenizers;\;whilestk.hasMoreTokens{System.out.printlnstk.nextToken;}}}解输出的结果是FridaySaturdaySundayMondayTuesday7.编写程序,在命令行输入java类文件名1124627310356,求这一串数字的最大值和平均数解publicclassHello{publicstaticvoidmainString[]args{doubletotal=0;intmax=0;forinti=0;iargs.length;i++{total=total+Integer.parseIntargs[i];ifmaxInteger.parseIntargs[i]max=Integer.parseIntargs[i];}}}8.编写程序,输入两个字符串,完成以下几个功能
(1)求出两个字符串的长度
(2)检验第一个串是否为第二个串的子串
(3)把第一个串转化为byte类型并输出解importimportpublicclassHello{publicstaticvoidmainString[]args{Scannerscan=newScannerSystem.in;System.out.println请输入字符1;Stringstr1=scan.nextLine;System.out.println请输入字符2;Stringstr2=scan.nextLine;ifstr
2.indexOfstr1==-1System.out.println字符串1不是字符串2的子串;elseSystem.out.println字符串1是字符串2的子串;byteb[]=str
1.getBytes;forinti=0;istr
1.length;i++System.out.printlnb[i];}}第8章1.Java为什么要引入线程机制?线程的概念是什么?线程和进程的区别是什么?解释什么是Java的多线程?答Java之所以引入线程机制是因为线程间的通信非常简单且有效,上下文切换非常快,它们是同一个进程中的两部分之进行的切换,每个线程彼此独立执行,一个程序可以同时使用多个线程来完成不同的任务所谓线程是指进程中单一顺序的执行流进程是一个动态执行的程序当你运行一个程序的时候,就创建了一个用来容纳组成代码和数据空间的进程每一个进程都有自己的一块内存空间和一组系统资源,它们之间都是独立的线程可以共享内存单元和系统资源,但不能够单独执行,必须存在于某个进程当中它是比进程更小的能独立运行的基本单位Java中的线程由虚拟的CPU、CPU所执行的代码和CPU所处理的数据三部分组成Java的多线程就是系统每次给Java程序一个CPU时间,Java虚拟处理机在多个线程之间轮流切换,保证每个线程都能机会使用CPU资源,不过每个时刻只能有一个线程在执行2.线程创建方式有哪两种?请举例说明答两种途径来实现多线程的创建一种是直接继承Thread类并重写其中的run方法,另一种是使用Runnable接口途径一classSimpleThreadextendsThread{privateStringthreadname; publicSimpleThreadStringstr{ threadname=str;被调用!; try{ sleep10; }catchInterruptedExceptione{} }}}途径二classSimpleThreadimplementsRunnable{ publicSimpleThreadStringstr{ super(str);被调用!; try{ Thread.sleep10; }catchInterruptedExceptione{} } }}3.什么是线程的生命期?它包括哪几种状态?它们的关系是什么?答线程的生命期是指从线程被创建开始到死亡的过程,通常包括5种状态新建、就绪、运行、阻塞、死亡它们的关系如图所示新建状态死亡状态运行状态阻塞状态NewThreadstartstop就绪状态stopstoprun结束wait、sleep、suspend等阻塞消除调度时间片结束或调用yield4.请举例说明如何实现线程的同步(用两种方法)方法一(方法同步)classStack{privateintnumber;privateintlen=0;publicsynchronizedvoidputintt{whilelen==1{try{this.wait;}catchInterruptedExceptione{}}number=t;len=1;this.notify;}publicsynchronizedintget{whilelen==0{try{this.wait;}catchInterruptedExceptione{}}len=0;this.notify;returnnumber;}}方法二(对象同步)classStack{privateintnumber;privateintlen=0;publicvoidputintt{synchronizedthis{whilelen==1{try{this.wait;}catchInterruptedExceptione{}}number=t;len=1;this.notify;}}publicintget{synchronizedthis{whilelen==0{try{this.wait;}catchInterruptedExceptione{}}len=0;this.notify;returnnumber;}}}classInputimplementsRunnable{Stacksstack;publicInputStacks{sstack=s;}publicvoidrun{forinti=1;i5;i++{sstack.puti;System.out.println向Stack放入数字:+i;try{Thread.sleepintMath.random*10;}catchInterruptedExceptione{}}}}classOutputimplementsRunnable{Stacksstack;publicOutputStacks{sstack=s;}publicvoidrun{inttemp;forinti=1;i5;i++{temp=sstack.get;System.out.println向Stack取出数字:+temp;try{Thread.sleepintMath.random*10;}catchInterruptedExceptione{}}}}publicclassHello{publicstaticvoidmainStringargs[]{Stacks=newStack;Inputt=newInputs;Outputo=newOutputs;Threadt1=newThreadt;Threadt2=newThreado;t
1.start;t
2.start;}}5.Java种有哪些情况会导致线程的不可运行?答一是调用了wait()方法,使得线程等待;二是调用了sleep(inttime)方法,使得线程休眠;三是调用了suspend()方法,使得线程挂起;四是由于输入输出流而引起阻塞6.wait方法和sleep方法的区别是什么?答sleep方法使线程进入睡眠状态,但它并不会释放线程持有的资源,不能被其他资源唤醒,不过睡眠一段时间会自动醒过来,而wait方法让线程进入等待状态的同时也释放了持有的资源,能被其他资源唤醒7.线程组的作用是什么?如何创建一个线程组?答线程组是把多个线程集成到一个对象里并可以同时管理这些线程在线程创建时,可以将线程放在某个指定的线程组中,也可以将它放在一个默认的线程组若创建线程而不明确指定属于哪个组,它们就会自动归属于系统默认的线程组以下三种Thread类的构造方法实现线程创建的同时指定其属于哪个线程组publicThread(ThreadGroupgroup,Runnabletarget);publicThread(ThreadGroupgroup,Stringname);publicThread(ThreadGroupgroup,Runnabletarget,Stringname);8.Java线程调度的原则是什么?答Java调度器调度遵循以下原则优先级高的线程比优先级低的线程线程先调度,优先级相等的线程按照排队队列的顺序进行调度,先到队列的线程先被调度当一个优先级低的线程运行过程中,来了一个高优先级线程,在时间片方式下,优先级高的线程要等优先级低的线程时间片运行完毕才能被调度,而在抢占式调度方式下,优先级高的线程可以立刻获得CPU的控制权9.如何理解死锁?答如果两个或多个线程都在互相等待对方持有的锁(唤醒),那么这些线程都进入阻塞状态,永远地等待下去,无法执行,程序就出现了死锁10.下列程序输出的结果是什么?classDaemonextendsThread{publicvoidrun{ifthis.isDaemon==falseSystem.out.printlnthreadisnotdaemon;elseSystem.out.printlnthreadisdaemon;try{forinti=0;i10;i++{System.out.printlni;Thread.sleep200;}}catchInterruptedExceptione{}System.out.printlnthreaddone!;}}publicclassTest{publicstaticvoidmainString[]args{Threadt=newDaemon;t.setDaemontrue;t.start;try{Thread.sleep900;}catchInterruptedExceptione{}System.out.printlnmaindone!;}}答输出结果为threadisdaemon01234maindone!11.编写程序实现如下功能一个线程进行如下运算1*2+2*3+3*4+……+1999*2000而另一个线程则每隔一段时间读取前一个线程的运算结果解classResult{privatelongtotal=1*2;publicvoidwritelongt{total=total+t;}publiclongread{returntotal;}}classAdditionimplementsRunnable{Resultrt;publicAdditionResults{rt=s;}publicvoidrun{forinti=2;i2000;i++{longtmp=0;tmp=i*i+1;rt.writetmp;try{Thread.sleep10;}catchInterruptedExceptione{}}}}classOutputimplementsRunnable{Resultrt;publicOutputResults{rt=s;}publicvoidrun{longtemp;forinti=1;i200;i++{temp=rt.read;System.out.printlntemp;try{Thread.sleep100;}catchInterruptedExceptione{}}}}publicclassHello{publicstaticvoidmainStringargs[]{Resultrt=newResult;Additiont=newAdditionrt;Outputo=newOutputrt;Threadt1=newThreadt;Threadt2=newThreado;t
1.start;t
2.start;}}12.编写程序实现如下功能第一个线程打印6个a,第二个线程打印8个b,第三个线程打印数字1到10,第二和第三个线程要在第一个线程打印完成之后才能开始打印解classThread1extendsThread{publicvoidrun{forinti=0;i6;i++{System.out.printlna;}}}classThread2extendsThread{publicvoidrun{try{forinti=0;i8;i++{System.out.printlnb;Thread.sleep100;}}catchInterruptedExceptione{}}}classThread3extendsThread{publicvoidrun{try{forinti=1;i=10;i++{System.out.printlni;Thread.sleep100;}}catchInterruptedExceptione{}}}publicclassTest{publicstaticvoidmainString[]args{Thread1t1=newThread1;Thread2t2=newThread2;Thread3t3=newThread3;t
1.start;try{t
1.join;}catchInterruptedExceptione{}t
2.start;t
3.start;}}13.编写一个线程同步的程序有一个字符缓冲区,长度为length,我们创建两个线程,其中一个线程向字符缓冲区写入一个字符,(字符缓冲区一次只能装入一个字符),另一个线程从字符缓冲区取出一个字符,并且输出,要保证当一个线程在写字符的时候,另一个线程不能访问字符缓冲区,而且在字符缓冲区为空的时候取不出字符,而在字符缓冲区满的时候写不进字符解classStack{privatechar[]stack=newchar[length+1];privateintnum=0;publicsynchronizedvoidwritecharc{whilenum==length{try{this.wait;}catchInterruptedExceptione{}}num++;stack[num]=c;this.notify;}publicsynchronizedcharread{whilenum==0{try{this.wait;}catchInterruptedExceptione{}}num--;this.notify;returnstack[num+1];}}classInputimplementsRunnable{Stacksstack;publicInputStacks{sstack=s;}publicvoidrun{forinti=1;i10;i++{chartmp;tmp=char96+i;sstack.writetmp;System.out.println向字符缓冲区写入字符:+tmp;try{Thread.sleepintMath.random*10;}catchInterruptedExceptione{}}}}classOutputimplementsRunnable{Stacksstack;publicOutputStacks{sstack=s;}publicvoidrun{chartemp;forinti=1;i10;i++{temp=sstack.read;System.out.println从字符缓冲区取出字符:+temp;try{Thread.sleepintMath.random*10;}catchInterruptedExceptione{}}}}publicclassTest{publicstaticvoidmainStringargs[]{Stacks=newStack;Inputt=newInputs;Outputo=newOutputs;Threadt1=newThreadt;Threadt2=newThreado;t
1.start;t
2.start;}}14.什么是JavaApplet程序,它与前面介绍过的JavaApplication有何不同?Applet一般称之为小应用程序,JavaApplet就是用Java语言编写的这样的一些小应用程序,它们可以通过嵌入到Web页面或者其他特定的容器中来运行,也可以通过java开发工具的appletviewer来运行,并能够产生特殊的效果与独立执行的Java应用程序不同,Applet有自己的一套执行流程,而不是通过main方法来开始执行程序,并且在运行过程中Applet常会与用户进行互动操作,显示动态的页面效果,并且还会进行严格的安全检查,以防止潜在的不安全因素15.简述JavaApplet程序的开发步骤Applet的开发步骤大致可以分为以下三个步骤
(1)用UltraEdit或Notepad等纯文本软件编辑JavaApplet源程序
(2)利用javac编译器将Applet源程序转换成class字节码文件
(3)编写HTML页面,并通过<APPLET></APPLET>标签引用上述字节码文件16.简述与JavaApplet生命周期相关的四个方法Applet小程序的生命周期相对于Application而言较为复杂在其生命周期中涉及到Applet类的四个方法init()、start()、stop()和destroy(),Applet的生命周期中有相对应的四个状态初始态、运行态、停止态和消亡态当程序执行完init()方法以后,Applet小程序就进入了初始态;然后立刻执行start()方法,Applet小程序进入运行态;当Applet小程序所在的浏览器图标化或者是转入其它页面时,该Applet小程序立刻执行stop()方法,使Applet小程序进入停止态;在停止态中,如果浏览器又重新加载该Applet小程序所在的页面,或者是浏览器从图标中还原,则Applet小程序又会调用start()方法,进入运行态;不过,在停止态时,若浏览器被关闭,则Applet小程序会调用destroy()方法,使其进入消亡态17.编写一个JavaApplet程序,使其在窗口中以红色、绿色和蓝色为顺序循环显示字符串“WelcometoJavaApplet”publicclassJumpTextextendsAppletimplementsRunnable{ThreadrunThread;inti;publicvoidstart{ifrunThread==null{runThread=newThreadthis;runThread.start;i=0;}}publicvoidstop{ifrunThread!=null{runThread.stop;runThread=null;}}publicvoidrun{whiletrue{i=i+1%3;repaint;try{Thread.sleep1000;}catchInterruptedExceptione{}}}publicvoidpaintGraphicsg{switchi{case0:g.setColorColor.red;break;case1:g.setColorColor.green;break;case2:g.setColorColor.blue;break;}g.drawStringWelcometoJavaApplet850;}}18.列举几个Graphics类提供的方法,并说明其用法
(1)drawString(Stringstr,intx,inty)用于字符串输出
(2)publicvoiddrawLine(intx1,inty1,intx2,inty2)其功能为以像素为单位绘制一条从(x1,y1)至(x2,y2)的直线
(3)drawRect()方法可以进行矩形的绘制
(4)fillRect()方法用于绘制以前景色填充的实心矩形
(5)drawRoundRect()和fillRoundRect()方法来绘制圆角矩形
(6)getImage()和drawImage()方法来实现在程序中显示漂亮的背景或图像
(7)getAudioClip()、loop()和stop()等方法用来支持声音文件的播放19.编写Applet程序,绘制一幅五颜六色的图publicclassColorAppletextendsApplet{publicvoidpaintGraphicsg{g.setColorColor.red;g.drawOval10103030;g.setColorColor.green;g.drawOval50508080;g.setColorColor.blue;g.drawOval110110130130;g.setColorColor.yellow;g.drawOval110103030;g.setColorColor.pink;g.drawOval160508080;}}20.编写一简易自行车在公路上由左向右行驶的Applet程序publicclassMovingImgextendsApplet{Imageimg0img1;intx=10;publicvoidinit{img0=getImagegetCodeBaseroad.gif;img1=getImagegetCodeBasecar.gif;}publicvoidpaintGraphicsg{g.drawImageimg0010this;g.drawImageimg1x30this;g.drawImageimg0060this;try{Thread.sleep50;x+=5;ifx==550{x=10;Thread.sleep1500;}}catchInterruptedExceptione{}repaint;}}注road.gif为公路边线图,car.gif为自行车图片第9章1.图形用户界面的设计原则有哪些?通常,图形用户界面的开发都要遵循一些设计原则,比如
(1)用户至上的原则设计界面时一定要充分考虑用户的实际需要,使程序能真正吸引住用户,让用户觉得简单易用
(2)交互界面要友好
(3)配色方案要合理建议用柔和的色调,不用太刺眼的颜色2.AWT组件集提供的组件大致可以分为哪几类?各起有什么作用?AWT组件大致可以分为以下三类
(1)容器类组件
(2)布局类组件
(3)普通组件类容器类组件可以用来容纳其他普通组件或者甚至是容器组件自身,起到组织用户界面的作用;布局类组件本身是非可视组件,但它们却能很好地在容器中布置其他普通可视组件;AWT提供了一系列的普通组件以构建用户图形界面,它们主要包括标签、文本框、文本域、按钮、复选框、单选框、列表框、下拉框、滚动条和菜单等3.AWT提供的布局方式有哪几种?请分别进行简述
(1)FlowLayoutFlowLayout是最简单的一种布局方式,被容纳的可视组件从左向右,从上至下依次排列,若一组件在本行放置不下,就自动排到下一行的开始处,该方式为Panel类和Applet类容器的默认布局方式
(2)BorderLayoutBorderLayout布局方式的特点是将容器划分为“东”“西”“南”“北”“中”五个区,分别为BorderLayout.EAST、BorderLayout.WEST、BorderLayout.SOUTH、BorderLayout.NORTH和BorderLayout.CENTER,每个区可以摆放一个组件,因此最多可以在BorderLayout的容器组件中放置五个子组件,前面已提到过,该布局方式是Frame或Dialog容器类组件的默认布局方式
(3)GridLayoutGridLayout布局将容器划分为行和列的网格,每个网格单元可以放置一个组件,组件通过add()方法从上到下,从左至右顺序加入网格各个单元中,因此,在使用这种布局时,用户应首先设计好排列位置,然后再依次调用add()方法进行添加
(4)GridBagLayoutGridBagLayout是所有AWT布局管理方式中最繁的,同时也是功能最强的,这主要是因为它提供了许多可设置参数,使得容器的布局方式可以得到准确的控制,尽管设置步骤相对要复杂得多,但是只要理解了它的基本布局思想,就可以很容易使用GridBagLayout来进行界面设计了
(5)CardLayoutCardLayout布局将组件(通常是Panel类的容器组件)象扑克牌(卡片)一样摞起来,每次只能显示其中的一张,实现分页的效果,每一页中可以有各自的界面,这样就相当于扩展了原本有限的屏幕区域4.简述如何创建AWT的菜单系统AWT提供的菜单系统类包括MenuBar、MenuItem、Menu、CheckboxMenuItem以及PopupMenuMenuBar类对应菜单系统的整体,Menu类对应菜单系统中的一列菜单(实际上它只是一种特殊的菜单项),MenuItem和CheckboxMenuItem类则对应具体的菜单项,其中CheckboxMenuItem为带复选框的菜单项,而PopupMenu类对应弹出式菜单,它是菜单Menu类的子类菜单系统创建好后,最后必须调用Frame类的setMenuBar()方法将其加入到框架界面中5.简述AWT提供的基于事件监听模型的事件处理机制基于事件监听模型的事件处理是从一个事件源授权到一个或多个事件监听者,组件作为事件源可以触发事件,通过addXXXlistener()方法向组件注册监听器,一个组件可以注册多个监听器,如果组件触发了相应类型的事件,此事件被传送给已注册的监听器,事件监听器通过调用相应的实现方法来负责处理事件的过程6.列出几个你所熟悉的AWT事件类,并举例说明什么时候会触发这些事件
(1)ActionEvent类可以是鼠标单击按钮或者菜单,也可以是列表框的某选项被双击或文本框中的回车行为
(2)KeyEvent类当用户按下或释放键时产生该类事件,也称为键盘事件3MouseEvent类当用户按下鼠标、释放鼠标或移动鼠标时会产生鼠标事件7.AWT规定的MouseEvent类对应哪些监听器接口?这些接口中都定义有哪些抽象方法?
(1)MouseListenerpublicabstractvoidmouseClickedMouseEventmouseevent;publicabstractvoidmousePressedMouseEventmouseevent;publicabstractvoidmouseReleasedMouseEventmouseevent;publicabstractvoidmouseEnteredMouseEventmouseevent;publicabstractvoidmouseExitedMouseEventmouseevent;
(2)MouseMotionListenerpublicabstractvoidmouseDraggedMouseEventmouseevent;publicabstractvoidmouseMovedMouseEventmouseevent;8.简述AWT为何要给事件提供相应的适配器(即Adapter类)?Java规定实现一个接口时必须对该接口的所有抽象方法进行具体的实现,哪怕有些抽象方法事件用户根本用不上,也要将其实现,比如上例中的keyPressed()方法,为此,Java提供了一种叫做Adapter(适配器)的抽象类来简化事件处理程序的编写适配器类很简单,它其实就是一个实现了接口中所有抽象方法的“空”类,本身不提供实际功能,9.简述AWT与Swing组件集间的区别?AWT组件集依赖于特定的平台,而Swing组件集独立于运行平台;Swing组件集实现了模型与视图和组件相分离;Swing组件集提供了比AWT更多、功能更强的组件,增加了新的布局管理方式(如BoxLayout),同时还设计出了更多的处理事件10.创建一个有文本框和三个按钮的框架窗口程序,同时要求按下不同按钮时,文本框中能显示不同的文字publicclassActionEvent1{privatestaticFrameframe;//定义为静态变量以便main使用privatestaticPanelmyPanel;//该面板用来放置按钮组件privateButtonbutton1;//这里定义按钮组件 privateButtonbutton2;//以便addActionListenerprivateButtonbutton3;privateTextFieldtextfield1;//定义文本框组件publicActionEvent1//构造方法建立图形界面{//创建面板容器类组件myPanel=newPanel;//创建按钮组件button1=newButton按钮1;button2=newButton按钮2;button3=newButton按钮3;textfield1=newTextField30;MyListenermyListener=newMyListener;//建立一个actionlistener让两个按钮共享button
1.addActionListenermyListener;button
2.addActionListenermyListener;button
3.addActionListenermyListener;textfield
1.addActionListenermyListener;myPanel.addbutton1;//添加组件到面板容器myPanel.addbutton2;myPanel.addbutton3;myPanel.addtextfield1;}//定义行为事件处理内部类它实现ActionListener接口privateclassMyListenerimplementsActionListener{/*利用该内部类来监听所有行为事件源产生的事件*/publicvoidactionPerformedActionEvente{//利用getSource方法获得组件对象名//也可以利用getActionCommand方法来获得组件标识信息//如e.getActionCommand.equals按钮1Objectobj=e.getSource;ifobj==button1textfield
1.setText按钮1被单击;elseifobj==button2textfield
1.setText按钮2被单击;elseifobj==button3textfield
1.setText按钮3被单击;elsetextfield
1.setText;}}publicstaticvoidmainStrings[]{ActionEvent1ae=newActionEvent1;//新建ActionEvent1组件frame=newFrameActionEvent1;//新建Frame//处理窗口关闭事件的通常方法属于匿名内部类frame.addWindowListenernewWindowAdapter{publicvoidwindowClosingWindowEvente{System.exit0;}};frame.addmyPanel;frame.pack;frame.setVisibletrue;}}11.创建一个带有多级菜单系统的框架窗口程序,要求每单击一个菜单项,就弹出一个相对应的信息提示框classDialogFrameextendsJFrameimplementsActionListener{publicDialogFrame{setTitle练习11;setSize300300;addWindowListenernewWindowAdapter{publicvoidwindowClosingWindowEvente{System.exit0;}};JMenuBarmbar=newJMenuBar;setJMenuBarmbar;JMenufileMenu=newJMenu文件;JMenus=newJMenu特殊功能;s.addspecials
[0];specials
[0].addActionListenerthis;s.addspecials
[1];specials
[1].addActionListenerthis;mbar.addfileMenu;fileMenu.adds;aboutItem=newJMenuItem关于;aboutItem.addActionListenerthis;fileMenu.addaboutItem;exitItem=newJMenuItem退出;exitItem.addActionListenerthis;fileMenu.addexitItem;}publicvoidactionPerformedActionEventevt{Objectsource=evt.getSource;ifsource==aboutItem{ifdialog1==null//firsttimedialog1=newAboutDialogthis关于;dialog
1.show;}elseifsource==exitItem{System.exit0;}elseifsource==specials
[0]{ifdialog2==null//firsttimedialog2=newAboutDialogthis功能1;dialog
2.show;}elseifsource==specials
[1]{ifdialog3==null//firsttimedialog3=newAboutDialogthis功能2;dialog
3.show;}}privateAboutDialogdialog1;privateAboutDialogdialog2;privateAboutDialogdialog3;privateJMenuItemaboutItem;privateJMenuItemexitItem;privateJMenuItem[]specials={newJMenuItem功能1newJMenuItem功能2};}classAboutDialogextendsJDialog{publicAboutDialogJFrameparentStringtitle{superparenttitletrue;JPanelp2=newJPanel;JButtonok=newJButtonOk;p
2.addok;getContentPane.addp2Center;ok.addActionListenernewActionListener{publicvoidactionPerformedActionEventevt{setVisiblefalse;}};setSize250150;}}publicclassDialogTest{publicstaticvoidmainString[]args{JFramef=newDialogFrame;f.show;}}12.创建Applet程序,实现以下界面及其功能publicclassCheckboxAppletextendsApplet{Checkboxcheckbox1;Checkboxcheckbox2;Checkboxcheckbox3;publicvoidinit{checkbox1=newCheckboxOption1nulltrue;checkbox2=newCheckboxOption2nullfalse;checkbox3=newCheckboxOption3nullfalse;addcheckbox1;addcheckbox2;addcheckbox3;}publicvoidpaintGraphicsg{Fontfont=g.getFont;FontMetricsfontMetrics=g.getFontMetricsfont;intheight=fontMetrics.getHeight;booleanchecked=checkbox
1.getState;ifcheckedg.drawStringOption1selected20120;elseg.drawStringOption1notselected20120;checked=checkbox
2.getState;ifcheckedg.drawStringOption2selected20120+height;elseg.drawStringOption2notselected20120+height;checked=checkbox
3.getState;ifcheckedg.drawStringOption3selected20120+2*height;elseg.drawStringOption3notselected20120+2*height;}publicbooleanactionEventevtObjectarg{repaint;returntrue;}}13.创建Applet程序,实现与下图一样的布局界面publicclassBorderAppletextendsApplet{CardLayoutcardLayout;Panelpanel;Buttonbutton1button2button3;publicvoidinit{panel=newPanel;addpanel;BorderLayoutlayout=newBorderLayout1010;setLayoutlayout;Buttonbutton1=newButtonButton1;Buttonbutton2=newButtonButton2;Buttonbutton3=newButtonButton3;Buttonbutton4=newButtonButton4;Buttonbutton5=newButtonButton5;addNorthbutton1;addSouthbutton2;addEastbutton3;addWestbutton4;addCenterbutton5;}}14.请分别用AWT及Swing组件来设计实现计算器程序,要求能完成简单四则运算下面给出Swing版的参考程序,AWT版的类似classCalculatorPanelextendsJpanelimplementsActionListener{publicCalculatorPanel{setLayoutnewBorderLayout;display=newJTextField0;display.setEditablefalse;adddisplayNorth;JPanelp=newJPanel;p.setLayoutnewGridLayout44;Stringbuttons=789/456*123-
0.=+;forinti=0;ibuttons.length;i++addButtonpbuttons.substringii+1;addpCenter;}privatevoidaddButtonContainercStrings{JButtonb=newJButtons;c.addb;b.addActionListenerthis;}publicvoidactionPerformedActionEventevt{Strings=evt.getActionCommand;if0=s.charAt0s.charAt0=9||s.equals.{ifstartdisplay.setTexts;elsedisplay.setTextdisplay.getText+s;start=false;}else{ifstart{ifs.equals-{display.setTexts;start=false;}elseop=s;}else{doublex=Double.parseDoubledisplay.getText;calculatex;op=s;start=true;}}}publicvoidcalculatedoublen{ifop.equals+arg+=n;elseifop.equals-arg-=n;elseifop.equals*arg*=n;elseifop.equals/arg/=n;elseifop.equals=arg=n;display.setText+arg;}privateJTextFielddisplay;privatedoublearg=0;privateStringop==;privatebooleanstart=true;}classCalculatorFrameextendsJFrame{publicCalculatorFrame{setTitleCalculator;setSize200200;addWindowListenernewWindowAdapter{publicvoidwindowClosingWindowEvente{System.exit0;}};ContainercontentPane=getContentPane;contentPane.addnewCalculatorPanel;}}publicclassCalculator{publicstaticvoidmainString[]args{JFrameframe=newCalculatorFrame;frame.show;}}第10章1.以下哪一个为标准输出流类A、DataOutputStreamB、FilterOutputStreamC、PrintStreamD、BufferedOutputStreamC2.将读取的内容处理后再进行输出,适用下述哪种流 A、PipedStreamB、FilterStreamC、FileStreamD、ObjectStreamB3.DataInput和DataOutput是处理哪一种流的接口 A、文件流 B、字节流C、字符流 D、对象流B4.下面语句正确的是A、RandomAccessFileraf=newRandomAccesssFile“data.dat””rw”;B、RandomAccessFileraf=newRandomAccesssFilenewDataInputStream;C、RandomAccessFileraf=newRandomAccesssFile“data.dat”;D、RandomAccessFileraf=newRandomAccesssFilenewFile“data.dat”;A5.以下不是Reader基类的直接派生子类的是 A、BufferedReader B、FilterReaderC、FileReader D、PipedReaderC6.测试文件是否存在可以采用如下哪一个方法 A、isFile() B、isFiles() C、exist() D、exists()D7.Java中,InputStream和OutputStream是以为数据读写单位的输入输出流的基类;Reader和Writer是以 为数据读写单位的输入输出流的基类字节;字符8.以字符方式对文件进行读写可以通过 类和类来实现FileReader;FileWriter9.RandomAccessFile类所实现的接口有 和 ,调用它的 方法可以移动文件位置指针,以实现随机访问DataInput;DataOutput;seek10.简述Java中的标准输入输出是怎么实现的System为Java自动导入包java.lang里的一个类,它含有三个内建好的静态流对象err、in和out,in属于InputStream对象,而err和out属于PrintStream对象,它们分别用于标准错误输出、标准输入和标准输出,程序中可以直接使用这三个流对象,比如调用它们的println()或read()方法来实现标准输入输出功能,默认情况下,标准输入in用于读取键盘输入,而标准输出out和标准错误输出err用于把数据输出至启动程序运行的终端屏幕上11.简述java.io包是如何设计提供字节流和字符流输入输出体系的java.io包里包含了众多的输入输出流类,其中以字节为处理单位的流称为字节流,而以字符为处理单位的流称为字符流字节输入流的基类为InputStream,OutputStream抽象类是所有字节输出流类的基类,它们各自的派生关系如下所示����而Java设计的字符流体系中也有两个基本类Reader和Writer,分别对应字符输入流和字符输出流,它们的派生图如下����12.简述File类的应用,它与RandomAccessFile类有何区别File类直接处理文件和文件系统本身,也就是说File类并不关心怎样从文件读取数据流或向文件存储数据流,它主要用来描述文件或目录的自身属性通过创建File类对象,我们可以处理和获取与文件相关的信息,比如文件名、相对路径、绝对路径、上级目录、是否存在、是否是目录、可读、可写、上次修改时间和文件长度等此外,当File对象为目录时,还可以列举出它的文件和子目录File类不能进行文件读写操作,必须通过其他类来提供该功能,RandomAccessFile类就是其中之一RandomAccessFile类文件存取方式灵活,它支持随机存取(RandomAccess)在文件中可以任意移动读取位置13.编程实现文件内容合并,即将某文件的内容写入到另一个文件的末尾处参考程序如下publicclassUnion{publicstaticvoidappendStringfile1Stringfile2{try{FileWriterwriter=newFileWriterfile1true;FileReaderfr=newFileReaderfile2;BufferedReaderbfr=newBufferedReaderfr;Stringstr=bfr.readLine;whilestr!=null{writer.writestr;str=bfr.readLine;}writer.close;}catchIOExceptione{e.printStackTrace;}}publicstaticvoiddisplayStringfileName{try{FileReaderfr=newFileReaderfileName;BufferedReaderbfr=newBufferedReaderfr;Stringstr=bfr.readLine;whilestr!=null{str=bfr.readLine;}}catchIOExceptionioe{}catchExceptione{}}publicstaticvoidmainString[]args{Stringfile1=F:/me/data
1.txt;Stringfile2=F:/me/data
2.txt;appendfile1file2;displayfile1;}}14.编写一递归程序,列举出某个目录下的所有文件以及所有子目录(包括其下的文件和子目录),要求同时列出它们的一些重要属性参考程序如下classLists{staticvoidlistStringstrPaththrowsException{try{Filef=newFilestrPath;iff.isDirectory{File[]fList=f.listFiles;forintj=0;jfList.length;j++{iffList[j].isDirectory{listfList[j].getPath;}}forintj=0;jfList.length;j++{iffList[j].isFile{}}}}catchExceptione{}}publicstaticvoidmainString[]args{Stringpath=F:\\me;try{listpath;}catchExceptione{}}}15.尝试自定义两个过滤流子类(如CaseInputStream和CaseOutputStream),实现将字母进行大小写转换功能例如,键盘标准输入为aAbB,用CaseInputStream读取后应转换为AaBb,再用CaseOutputStream进行输出时,又会变为aAbB参考程序如下//CaseInputStream类publicclassCaseInputStreamextendsFilterInputStream{publicCaseInputStreamInputStreami{superi;}//overrideabstractmethod:readpublicintreadthrowsIOException{returnTransin.read;}privateintTransintc{ifc=Ac=Zc=c+32;ifc=ac=zc=c-32;returnc;}}//CaseOutputStream类publicclassCaseOutputStreamextendsFilterOutputStream{publicCaseOutputStreamOutputStreami{superi;}//overrideabstractmethod:writeintcpublicvoidwriteintcthrowsIOException{out.writeTransc;}privateintTransintc{ifc=Ac=Zc=c+32;ifc=ac=zc=c-32;returnc;}}16.编一程序要求
(1)在当前目录下创建文件students.dat
(2)录入一批同学的身份证号、姓名和高考总分到上述文件中
(3)提供查询第n位同学信息的功能
(4)提供删除第n位同学信息的功能
(5)提供随机录入功能,即新录入的同学信息可以插入到第n位同学之后参考程序如下importmyPackage.MyInput;classStudent{privateStringBufferid;privateStringBuffername;privateshortscore;publicStudentStringpidStringnintp{id=newStringBufferpid;id.setLength16;name=newStringBuffern;name.setLength7;score=shortp;}publicStringgetId{returnid.toString;}publicStringgetName{returnname.toString;}publicshortgetScore{returnscore;}publicstaticintsize{return48;}}publicclassStudents{publicstaticvoidcreatethrowsIOException{Filef=newFilestudents.dat;//以读写方式打开students.dat文件RandomAccessFileraf=newRandomAccessFilefrw;//将students中的书本信息写入文件forinti=0;istudents.length;i++{raf.writeCharsstudents[i].getId;raf.writeCharsstudents[i].getName;raf.writeShortstudents[i].getScore;}raf.close;}publicstaticvoidquerythrowsIOException{Filef=newFilestudents.dat;RandomAccessFileraf=newRandomAccessFilefr;//利用自定义类MyInput进行数据输入intn=MyInput.intData;//通过seek定位到第n位同学的信息起始位置raf.seekn-1*Student.size;//pid存放读取到的身份证信息char[]pid=newchar
[16];charch;forinti=0;i16;i++{ch=raf.readChar;ifch==0pid[i]=\0;elsepid[i]=ch;}//sname存放读取到的人名char[]sname=newchar
[7];forinti=0;i7;i++{ch=raf.readChar;ifch==0sname[i]=\0;elsesname[i]=ch;}raf.close;}publicstaticvoiddeletethrowsIOException{}publicstaticvoidinsertthrowsIOException{}publicstaticvoidmainString[]argsthrowsIOException{Label:whiletrue{switchMyInput.intData{case1:create;//创建文件并写入信息break;case2:query;//查询第n位同学信息break;case3:delete;//删除第n位同学信息break;case4:insert;//录入新的信息break;case5:breakLabel;}}}}第11章
1、程序中读取图像的方法有哪些?有三种方式将图像读取到程序中
(1)借助于java.awt包中Tookit类的getImage方法,它返回Image类型的对象,但并不等待图像读取完成Stringfilename=“…”;Toolkittk=Toolkit.getDefaultToolkit;Imageimage=tk.getImagefilename;
(2)借助于javax.swing包中ImageIcon类的getImage方法,它也是返回Image类型的对象,并且等待图像完全读取之后返回Stringfilename=“…”;ImageIconicon=newImageIconfilename;Imageimage=icon.getImage;
(3)借助于javax.imageio包中的ImageIO类的read方法,它仍是返回Image类型的对象,并且等待图像完全读取之后返回Stringfilename=“…”;Imageimage=ImageIO.readnewFilefilename;或者提供文件的URL Stringurlname=“…”;Imageimage=ImageIO.readnewURLurl;
2、编写程序,分别用三种不同的方式加载图片参考例11-
23、基本的图形变换有哪几种?基本的图形变换包括平移变换、尺度缩放、角度旋转和变形,这些变换可以认为是对图形进行的变换,也可以认为是对坐标系进行的变换
4、Graphics2D的图形变换方法分别是哪几个?
(1)平移变换Graphics2D类的translate方法实现了对Graphics2D坐标系的平移变换,translate方法的使用方式为g2d.translatexy ;g2d.draw... ;
(2)尺度缩放Graphics2D类的scale方法实现了对Graphics2D坐标系的尺度缩放功能,scale方法的使用方式为g2d.scalesxsy ;g2d.draw... ;
(3)角度旋转Graphics2D类的rotate方法实现了对Graphics2D坐标系的角度旋转功能,rotate方法的使用方式为g2d.rotateangle;g2d.draw... ;
(4)变形Graphics2D类的shear方法实现了对Graphics2D坐标系的变形功能,shear方法的使用方式为g2d.shearshxshy;g2d.draw... ;
5、简述AffineTransform类的对象创建方法
(1)直接通过变换矩阵的参数创建AffineTransform对象AffineTransformtransform=newAffineTransformabcdef;
(2)直接调用AffineTransform类的getTranslateInstance、getRotateInstance、getScaleInstance和getShearInstance方法来创建具有相应坐标变换功能的AffineTransform对象比如AffineTransformtransform=AffineTransform.getScaleInstance22;
(3)Graphics2D的getTransform方法,返回Graphics2D的变换对象;AffineTransformtransform=g2d.getTransform;
6、编写程序,用Graphics2D类来实现平移、尺度缩放、角度旋转和变形等坐标变换参考例11-
37、编写程序,用AffineTransform类来实现平移、尺度缩放、角度旋转和变形等坐标变换参考例11-
48、思考除了本章介绍的动画生成技术外,还可以采用何种方法生成动画本章把动画的所有动画帧放到了一张图片里面,每次显示动画帧时都先计算这一帧在图片里的具体位置,得到帧的位置后再绘制到屏幕上,从而产生动画效果也可以把每一帧放到一张单独的图片里,每次显示动画帧时,直接使用这一帧的图片,也可以产生动画效果,只是各帧图片要妥善存放和管理还可以把动画做成gif图片格式,显示动画效果是只要显示这张图片就行了,但这种方式会有诸多限制,比如动画显示的速度就不够灵活
9、如果一个动画的所有帧都放到了一张图片里面,那么如何正确定位到所需的那一帧?frameX=currentFrame%columns*frameWidth;frameY=currentFrame/columns*frameHeight;frameX、frameY、frameWidth和frameHeight都是以图片的像素为单位,frameX是当前动画帧在整个动画图片中的x坐标,frameY是当前动画帧在整个动画图片中的y坐标,currentFrame是动画帧的序号,columns是图片中帧的列数,frameWidth是动画帧的宽度,frameHeight是动画帧的高度
10、编写程序,实现自己的一个动画程序参考例11-5对于特定的动画,它的总帧数totalFrames、帧宽度frameWidth、帧高度frameHeight、帧的列数cols是不同的,根据具体情况设定程序中的这些初始值
11、试述动画闪烁产生的原因本章使用的动画生成技术中,在显示动画的每一帧之前,需要先用背景图片覆盖前一帧,然后再显示当前帧,所以在程序绘制背景图片的这一小段时间内本应看到动画的前一帧,但却看到了背景图片,就是这一短暂的时间段导致了闪烁的发生
12、简述消除动画闪烁的双缓冲技术消除闪烁的一种办法是,绘制完动画的当前帧,在绘制下一帧的时候,不是直接在屏幕上先绘制背景再绘制下一帧,而是先开辟一片内存,把背景图片和下一帧先绘制到这一片内存区域,然后再把这片内存中的背景图片和下一帧同时绘制到屏幕上,这样就避免了只看到背景图片的这一小段时间,使动画的前后各帧连续无间隔地被游戏玩家看到,从而避免了闪烁的产生,这种避免闪烁的技术就称为双缓冲技术,开辟的这一片保存背景和动画帧的内存称为缓存第12章
1、画出本章游戏的状态转移关系图
2、简述Point2D、SpriteImage和AnimatedSprite三个类的功能
(1)程序中小行星、飞船和子弹都具有位置属性,小行星和子弹还有速度属性,当然,位置可以用两个整型变量x和y来表示,速度也可以用横向速度x和纵向速度y来表示,但是为了使程序更具有面向对象特性,创建了Point2D类,它具有整型变量x和y,既可以表示位置坐标,也可以表示横向和纵向速度
(2)SpriteImage类实现了图片的加载、显示等基本操作,因为小行星、飞船、子弹的位置、角度等会发生变化,所以赋予它们的图片的位置、角度等需要作出响应,SpriteImage类也实现了这些操作
(3)AnimatedSprite类实现了小行星、飞船和子弹的运动功能,也实现了爆炸的动画功能
3、简述Class类及其常用方法当程序正在运行的时候,java运行时环境为每一个对象维护一个运行时类型信息,这个信息记录了对象所属的类型以及这个类型的相关情况,java虚拟机就是通过这个运行时类型信息选择正确的方法去调用这些运行时类型信息被封装到一个特殊的类里面,这个类就是Class每一个类都有一个getClass方法,调用这个方法就返回一个Class对象SpriteImageimage=newSpriteImage…;ClassimageClass=image.getClass;Class类的getName方法返回一个对象所属类的名字image.getClass.getName;如果知道类的名字,也可以通过Class的forName方法获得某个特殊类的Class对象StringclassName=“SpriteImage”;ClassimageClass=Class.forNameclassName;Class类的另一个特别有用的方法是getResourcefilename,这个方法专门获得图像或声音资源位置信息并返回一个URL对象,URL对象里面包含了文件名为filename的图像或声音资源的位置信息然后再利用URL读取图像或声音
4、编写程序,通过Class类及其方法加载图片publicclassDrawImageTestextendsJFrame{privatefinalintSCREENWIDTH=800;privatefinalintSCREENHEIGHT=600;privateImageimage=null;privatebooleanimageLoaded=false;publicDrawImageTestStringtitle{supertitle;setSizeSCREENWIDTHSCREENHEIGHT;setVisibletrue;setDefaultCloseOperationJFrame.EXIT_ON_CLOSE;loadImage;drawImage;}privatevoidloadImage{Toolkittk=Toolkit.getDefaultToolkit;image=tk.getImagegetURLbluespace
5.jpg;whileimage.getWidththis=0;imageLoaded=true;}//确保图片文件和SpriteImage.java的字节码文件位于同一目录下privateURLgetURLStringfilename{URLurl=null;try{url=this.getClass.getResourcefilename;}catchExceptione{}returnurl;}privatevoiddrawImage{repaint;}publicvoidpaintGraphicsg{Graphics2Dg2d=Graphics2Dg;if!imageLoaded{g2d.setFontnewFontGungsuhFont.BOLD20;g2d.drawStringloadingimages...SCREENWIDTH/2-40SCREENHEIGHT/2;}else{g2d.drawImageimage00SCREENWIDTH-1SCREENHEIGHT-1this;}}publicstaticvoidmainString[]args{newDrawImageTestdrawimagetest;}}
5、简述游戏程序中是如何让小行星、飞船和子弹运动起来的要想使小行星、飞船和子弹运动起来,需要一个独立于程序主线程的线程,它的run方法体里面的循环首先调用gameUpdate方法来更新小行星、飞船、子弹的位置、角度、是否继续生存等信息,并且更新爆炸动画的帧和动画的存亡等信息,这些信息都更新完毕之后绘制更新过的这些游戏实体,绘制完毕后睡眠适当的时间,如此循环往复从而让小行星、飞船和子弹运动起来
6、简述碰撞检测的原理根据两个Sprite的图片大小和位置创建两个围绕图片的矩形,然后调用Rectangle类的intersectsRectangler方法判断两个矩形是否有重叠的地方,如果重叠就判断为相撞
7、简述LinkedList类及其方法LinkedList是一个链表类,这个类以链表的方式存放和管理其中的元素,对于增加删除其中的元素比数组增删元素效率要高很多LinkedList类的使用方法一般是这样的先创建一个LinkedList对象LinkedListElist=newLinkedListE;其中E是链表中元素的类型;list.addEe;//向链表末尾添加一个类型为E的元素;list.removeintindex;//删除特定位置的元素;list.getintindex;//返回特定位置的元素;list.size;//返回链表元素的个数;list.clear;//删除链表所有元素;。