Java简明教程-习题参考答案4724.pdf
参考答案 第 1 章 1Java 语言有哪些主要特点。平台独立性 安全性 多线程 网络化 面向对象 2目前美国 Sun 公司提供的适用不同开发规模的 JDK 有哪些。目前 Sun 共提供了三种不同的版本:微平台版 J2ME(Java 2 Platform Micro Edition),标准版 J2SE(Java 2 Platform Standard Edition)和企业版 J2EE(Java 2 Platform Enterprise Edition),这三种版本分别适用于不同的开发规模和类型,对于普通 Java 开发人员和一般学习者来说,选用标准版 J2SE 就可以了,学会了 J2SE,再学 J2ME 或 J2EE 就比较容易上手,因为它们之间虽有所侧重,但相似之处很多,尤其是语言本身是一样的,都是Java。3Java Application 的开发步骤有哪些。Java Application 的开发步骤:(1)下载 JDK 软件并安装;(2)配置相应的环境变量(path 和 classpath);(3)编写 Java 源程序(文本编辑器或集成开发环境 IDE);(4)编译 Java 源程序,得到字节码文件(javac *.java);(5)执行字节码文件(java 字节码文件名)。4什么是环境变量,设置环境变量的主要目的是什么。环境变量的配置主要是为了进行“寻径”,也即让程序能找到它需要的文件,所以设置的内容就是一些路径。5 不参考书本,试着编写一个简单的 Java Application 程序,实现在 Dos 窗口输出“Welcome to Nanjing City!”字符串。并对该程序进行编译和运行。public class Hello public static void main(String args)Welcome to Nanjing City!);6编写一个 Java Application 程序,实现分行显示字符串“Welcome to Nanjing City”中的四个单词。public class Hello public static void main(String args)Welcome);to);Nanjing);City!);第 2 章 1Java 语言对于合法标识符的规定是什么指出以下哪些为合法标识符。a a2 3a *a _a$a int a%在 Java 语言中,标识符必须以字母、美元符号或者下划线打头,后接字母、数字、下划线或美元符号串。另外,Java 语言对标识符的有效字符个数不做限定。合法的标识符:a a2 _a$a 2变量的涵义是什么变量名与变量值的关系 在程序执行过程中其值可以改变的数据,称为变量,它本质上代表了内存中的一小块空间。每个变量都必须有对应的名称来标识它,即变量名,而变量空间所存放的数据则称为变量值。3Java 语言提供哪些基本的数据类型,为什么要提供这些不同的数据类型 布尔型:boolean 整型:byte、short、int 以及 long 浮点型(实型):float 以及 double 字符型:char 数据类型代表了数据的存储格式和处理方式,虽然严格来说计算机只能识别“0”和“1”,但是,有了数据类型以后,计算机的识别能力就被人为扩展了,它能够识别整数、实数以及字符等。4赋值语句的涵义是什么 数据传递。5数据类型强制转换的原则是什么如何转换 对于变窄转换,如 long 到 short、double 到 float,或者不兼容转换:float 到 short、char 到 short 等,则需要进行强制转换。float f=;short b;b=(short)f;(强制转换)6每一条程序语句都应以分号来结束,这个分号能否用中文输入模式下输入的分号,为什么 不能。首先中英文输入模式下输入的分号是不同的,不但外观不同,其存储所需的空间也是不同的,Java 编译器只能识别英文的分号,对于中文分号,将会报错。第 3 章 1假定乘坐飞机时,每位顾客可以免费托运 20kg 以内的行李,超过部分按每公斤收费元,以下是相应的计算收费程序。该程序存在错误,请找出。public class Test public static void main(String args)throws IOException float w,fee;语句 2有一条长的阶梯,如果每步 2 阶,则最后剩 1 阶,每步 3 阶则剩 2 阶,每步 5 阶则剩 4阶,每步 6 阶则剩 5 阶,只有每步 7 阶的最后才刚好走完,一阶不剩,问这条阶梯最少共有多少阶找出以下求解程序的错误所在。public class Test public static void main(String args)int i;while(i%2=1&i%3=2&i%5=4&i%6=5&i%7=0)i+;这条阶梯最少有:+i+阶);1)变量 i 应进行初始化。2)while 循环的条件表达式应再加上“非”,这样才符合逻辑。3试用单分支结构设计一判断用户输入值 X,当 X 大于零时求 X 值平方根,否则不执行任何操作的程序。import.*;import.*;public class Test public static void main(String args)throws IOException float x;InputStreamReader reader=new InputStreamReader;BufferedReader input=new BufferedReader(reader);请输入 x:);String temp=();x=(temp);public class Test public static void main(String args)throws IOException char A,B,c1,c2;c1=(char)c2=(char)if(c1c2)A=c2;B=c1;else A=c1;B=c2;A=+A+B=+B);5用穷举法求出 3 位数中百、十、个位数的立方和就是该数的数。public class Test public static void main(String args)int a,b,c,x=100;while(x1000)a=x%10;b=(x%100-a)/10;c=(x-x%100)/100;if(a*a*a+b*b*b+c*c*c=x)x+=1;6编程实现打印以下图案:*public class Test public static void main(String args)int i,j,k;public class Test public static void main(String args)throws IOException char sex=f;switch(sex)case m:男性);break;case f:女性);case u:未知);女性 未知 10读程序,写结果。public class Test public static void main(String args)int i,s=0;for(i=1;i=100;i+)if(i%3=0)continue;s+=i;s=+s);s=3367 11读程序,写结果。public class Test public static void main(String args)int i,s=0;for(i=1;i100)break;s=+s);s=105 12个位数是 6,且能被 3 整除的 5 位数有多少 public class Test public static void main(String args)int i=10006,count=0;while(i)if(i%3=0)count+;i+=10;符合条件的数共有+count+个);13用嵌套循环结构,设计一模拟电子钟的程序。提示:定义三个变量分别代表“小时”、“分”和“秒”,根据电子钟分、秒、小时之间的关系,采用三重循环来控制各量的增加,并由输出语句将变化中的三个量分别予以输出显示,即为一模拟数字电子钟。此外,Java 语言提供的延时方法为(1000);1000 的单位为毫秒,即延时 1 秒。import.*;public class Test public static void main(String args)throws InterruptedException int hour=12,min=0,sec=0;while(hour24)while(min60)while(sec60)sec+;(1000);时-+min+分-+sec+秒);sec=0;min+;min=0;hour+;第 4 章 1以下叙述中不正确的是_。A、在方法中,通过 return 语句传回方法值 B、在一个方法中,可以执行有多条 return 语句,并返回多个值 C、在 Java 中,主方法 main()后的一对圆括号中也可以带有参数 D、在 Java 中,调用方法可以在语句中完成 B 2以下正确的描述是_。A、方法的定义不可以嵌套,但方法的调用可以嵌套 B、方法的定义可以嵌套,但方法的调用不可以嵌套 C、方法的定义和方法的调用均不可以嵌套 D、方法的定义和方法的调用均可以嵌套 A 3以下正确的说法为_。A、在不同方法中不可以使用相同名字的变量 B、实际参数可以在被调方法中直接使用 C、在方法内定义的任何变量只在本方法范围内有效 D、在方法内的复合语句中定义的变量只在本方法语句范围内有效 C 4按 Java 语言的规定,以下正确的说法是_。A、实参不可以是常量,变量或表达式 B、形参不可以是常量,变量或表达式 C、实参与其对应的形参占用同一个存储单元 D、形参是虚拟的,不占用存储单元 D 5一个 Java Application 程序中有且只有一个 方法,它是整个程序的执行入口。main()方法 6方法通常可以认为由两部分组成,它们是 和 。方法头和方法体 7读程序写结果。public class Test static void m(int x,int y,int z)x=111;y=222;z=333;public static void main(String args )int x=100,y=200,z=300;m(x,y,z);x=100y=200z=300 8编写一个判断某个整数是否为素数的方法。public boolean prime(int x)for(int j=2;jx;j+);public class Test public static void main(String args)int a=0;请输入数 a:);try BufferedReader br=new BufferedReader(new InputStreamReader);a=();catch(IOException e)int b=0;请输入数 b:);try BufferedReader br=new BufferedReader(new InputStreamReader);b=();catch(IOException e)if(a=0|b=0)输入不合法!);最大公约数为:+Gys(a,b);最小公倍数为:+Gbs(a,b);public static int Gys(int a,int b)int r=0;if(ab)r=a;b=a;a=r;int i=1;while(i!=0)i=a%b;a=b;b=i;return a;public static int Gbs(int a,int b)int ab=a*b;int r=0;if(ab)r=a;b=a;a=r;int i=1;while(i!=0)i=a%b;a=b;b=i;return ab/a;10以下程序执行后的输出为 。public class Test static int m1(int a,int b)int c;a+=a;b+=b;c=m2(a,b);return(c*c);static int m2(int a,int b)int c;c=a*b%3;return(c);public static void main(String args)int x=1,y=3,z;z=m1(x,y);z=+z);z=0 11编写一个方法,实现求某整数的各位数字之和的功能。import.*;public class Test public static void main(String args)int i,a=0,s=0;请输入数 a:);try BufferedReader br=new BufferedReader(new InputStreamReader);a=();catch(IOException e)for(i=10;a%i!=a;i*=10)s+=(a%i)/(i/10);s+=a/(i/10);各位数之和为+s);12编写完成十进制整数到八进制的转换方法。import.*;public class Test public static void main(String args)int i,k,a=0,d,s=0;请输入数:);try BufferedReader br=new BufferedReader(new InputStreamReader);a=();catch(IOException e)d=a%8;s+=d;k=10;for(i=64;a-d!=0;i*=8)s+=(a-d)%i*8/i*k;k*=10;d=a%i;八进制数为+s);13用于指出数组中某个元素的数字被叫做 ;数组元素之所以相关,是因为它们具有相同的 和 。下标;数组名和数据类型。14数组 int results =new int6 所占存储空间是 字节。24 15使用两个下标的数组被称为 数组,假定有如下语句:float scores =1,2,3,4,5,6,7,8,9;则的值为:,scores1.length 的值为:,scores11的值为:。二维;3;2;5。16从键盘上输入 10 个双精度浮点数后,求出这 10 个数的和以及它们的平均值。要求分别编写相应求和及求平均值的方法。import.*;public class Test public static void main(String args)throws IOException InputStreamReader reader=new InputStreamReader;BufferedReader input=new BufferedReader(reader);String temp;double x=new double10;for(int i=0;i10;i+)temp=();xi=(temp);S(x);Avg(x);public static void S(double x);public class Scores public static void main(String args)throws IOException int sum=0;public class Test public static void main(String args)throws IOException char c=O,l,y,m,p,i,c,G,a,m,e,s;rever(c);public static void rever(char c)char t;for(int i=0,j=;ij;i+,j-)t=ci;ci=cj;cj=t;19Java 语言为什么要引入方法这种编程结构 提高复用度,减少程序代码量 促进程序结构化,提高可读性和可维护性 20为什么要引入数组结构,数组有哪些特点,Java 语言创建数组的方式有哪些 为了便于处理一批同类型的数据,Java 语言引入了数组类型;首先,数组中的每个元素都是相同数据类型的;其次,数组中的这些相同数据类型元素是通过数组下标来标识的,并且该下标是从 0 开始的;最后,数组元素在内存中的存放是连续的。Java 语言规定,创建数组可以有两种方式:初始化方式和 new 操作符方式。初始化方式是指直接给数组的每一个元素指定一个初始值,系统自动根据所给出的数据个数为数组分配相应的存储空间,通常这样创建数组的方式适用于数组元素较少的情形。对于数组比较大的情形,即数组元素过多,用初始化方式显然不妥,这时应采用第二种方式,即 new 操作符方式。第 5 章 1实现类 MyClass 的源码如下:class MyClass extends Object private int x;private int y;public MyClass()x=0;y=0;public MyClass(int x,int y).public void show()nx=+x+y=+y);public void show(boolean flag)if(flag)nx=+x+y=+y);else ny=+y+x=+x);protected void finalize()throws throwable ();在以上的源代码中,类 MyClass 的成员变量是_;构造方法是_;对该类的一个实例对象进行释放时将调用的方法是_。(多选)(A)private int x;(B)private int y;(C)public MyClass()(D)public MyClass(int x,int y)(E)public void show()(F)public void show(boolean flag)(G)protected void finalize()throws throwable 答案:AB CD G 2上题所声明的类 MyClass 的构造方法 MyClass(int x,int y)的目的是使 MyClass的成员变量 private int x,private int y 的值分别等于方法参数表中所给的值 int x,int y。请写出 MyClass(int x,int y)的方法体(用两条语句):_;_;答案:=x =y 3MyClass 声明同第一题。设 public static void main(String args)方法体如下:MyClass myclass;();编译运行该程序将会有何结果 (A)x=0 y=0(B)y=0 x=0(C)x=.y=.(x,y 具体为何值是随机的)(D)源程序有错 答案:D 4MyClass 声明同第一题。设 public static void main(String args)方法体如下:MyClass myclass=new MyClass(5,10);(false);编译运行该程序将会有何结果 (A)x=0 y=0(B)x=5 y=10(C)y=10 x=5 (D)y=0 x=0 答案:C 5MyClass 声明同第一题。设 public static void main(String args)方法体如下:MyClass myclass=new MyClass(5,10);(false);现在想在 main 方法中加上一条语句来释放 myclass 对象,应用下面哪条 (A)myclass=null;(B)free(myclass);(C)delete(myclass);(D)Java 语言中不存在相应语句 答案:A 6假设已编写好了类 Class1:package mypackage;public class Class1……它存在文件中。现在 main 方法所在的源程序如下:import mypackage;……假设操作系统中的 CLASSPATH 环境变量已被设成c:javalib;.;,而 main 方法所在的源程序存在目录 c:mydir 中(当前工作目录为 c:mydir),那么文件应存放在那个目录中呢_ 答案:c:mydir mypackage 7定义一个表示学生的类 student,成员变量有学号、姓名、性别、年龄,方法有获得学号、姓名、性别、年龄;修改年龄。书写 Java 程序创建 student 类的对象及测试其方法的功能。答:public class student private int stu_ID;private String name;private String sex;private int old;student(int id,String name,String sex,int old)stu_ID=id;=name;=sex;=old;void show_id()the student ID is:+stu_ID);void show_name()the student name is:+name);void show_sex()the student sex is:+sex);void show_old()the student old is:+old);void change_old(int newyear)old=newyear;public static void main(String args)student Lee=new student(,Li Ming,M,18);();();();();(20);();8根据下面的要求编程实现复数类 Complex。(1)复数类 Complex 的属性:real 代表复数的实数部分 imagin 代表复数的虚数部分(2)复数类 Complex 的方法:Complex():构造函数,将实部、虚部都置为 0;Complex(double r,double i):构造函数,创建复数对象的同时完成复数的实部、虚部的初始化,r 为实部的初值,i 为虚部的初值;getReal():获得复数对象的实部;getImagin():获得复数对象的虚部;complexAdd(Complex Number):当前复数对象与形参复数对象相加,所得的结果也是复数值,返回给此方法的调用者;complexMinus(Complex Number):当前复数对象与形参复数对象相减,所得的结果也是复数值,返回给此方法的调用者;complexMulti(Complex Number):当前复数对象与形参复数对象相乘,所得的结果也是复数值,返回给此方法的调用者;toString():把当前复数对象的实部、虚部组合成 a+bi 的字符串形式,其中 a 和 b 分别为实部和虚部的数据。答案:public class Complex private double real;private double imagin;Complex()real=0;imagin=0;Complex(double r,double i)real=r;imagin=i;public double getReal()return real;public double getImagin()return imagin;public Complex complexAdd(Complex Number)real=real+;imagin=imagin+;return this;public Complex complexMinus(Complex Number)real=;imagin=;return this;public Complex complexMulti(Complex Number)real=real*;imagin=imagin*;return this;public void tostring()+imagin+i);public static void main(String args)Complex a=new Complex();Complex b=new Complex(3,4);Complex c=new Complex(2,3);();();(b);();第 6 章 1B 2C 3接口中可以有的语句为_;(从 ABCD 中多选)一个类可以继承_父类,实现_接口;一个接口可继承_接口;(从 EF 中单选)接口_继承父类,_实现其它接口;实现某个接口的类_当作该接口类型使用;(从 GH 中单选)(A)int x;(B)int y=0;(C)public void aa();(D)public void bb()hello);(E)仅一个(F)一个或多个(G)可以(H)不可以 答案:BC;E;F;F;H;H;G 4解释 this 和 super 的意义和作用。答:Java 中,this 用来引用当前对象,与 this 类似,super 用来引用当前对象的父类。5什么是继承继承的意义如何定义继承关系 答:继承是一种由已有的类创建新类的机制。通过继承可以实现代码的复用,使程序的复杂性线性地增长,而不是随规模增大呈几何级数增长。由于父类代表了所有子类的共性,而子类既可继承其父类的共性,又可以具有本身独特的个性,在定义子类时,只要定义它本身所特有的属性与方法就可以了。6什么是多态 Java 程序如何实现多态有哪些实现方式 答:多态性是指同名的不同方法在程序中共存。即为同一个方法定义几个版本,运行时根据不同情况执行不同的版本。调用者只需使用同一个方法名,系统会根据不同情况,调用相应的不同方法,从而实现不同的功能。多态性又被称为“一个名字,多个方法”。多态性的实现有两种方式:覆盖实现多态性、重载实现多态性。7利用多态性编程,实现求三角形、正方形和圆形面积。方法:抽象出一个共享父类,定义一函数为求面积的公共界面,再重新定义各形状的求面积函数。在主类中创建不同类的对象,并求得不同形状的面积。答:利用多态性编程,实现求三角形、正方形和圆形面积。方法:抽象出一个共享父类,定义一函数为求面积的公共界面,再重新定义各形状的求面积函数。在主类中创建不同类的对象,并求得不同形状的面积。abstract class Shape abstract float area();class Circle extends Shape public float r;Circle(float r)=r;public float area()return*r*r;class Rectangle extends Shape public float width,height;Rectangle(float w,float h)width=w;height=h;public float area()return width*height;第 7 章 1String 类型与 StringBuffer 类型的区别是什么 答:String 类型的字符串是对原字符串的拷贝进行操作,而StringBuffer 类型的字符串是对原字符串本身进行操作的,操作后的结果会使原字符串发生改变。2有如下四个字符串 s1、s2、s3 和 s4:String s1=Hello World!;String s2=new String(Hello World!);s3=s1;s4=s2;求下列表达式的结果是什么 s1=s3 s3=s4 s1=s2(s2)(s2)答:下列表达式的结果是:false false false true 0 3下面程序输出的结果是什么 public class Test public static void main(String args)String s1=I like cat;StringBuffer sb1=new StringBuffer(It is Java);String s2;StringBuffer sb2;s2=(cat,dog);sb2=(2,4);s1 为:+s1);s2为:+s2);sb1 为:+s1);sb2为:+s2);答:程序的输出结果为:s1为:I like cat s2为:I like dog sb1为:I like cat sb2为:I like dog 4设 s1 和 s2 为 String 类型的字符串,s3 和 s4 为 StringBuffer 类型的字符串,下列那个语句或表达式不正确 s1=Hello World!;s3=Hello World!;String s5=s1+s2;StringBuffer s6=s3+s4;String s5=s1-s2;s1=s2 char c=();(),y);答:语句或表达式不正确的有:s3=Hello World!;StringBuffer s6=s3+s4;String s5=s1-s2;s1=s2 5StringTokenizer 类的主要用途是什么该类有哪几种重要的方法它们的功能是什么 答:StringTokenizer 类的主要用途是可以通过分析一个字符串把字符串分解成可被独立使用的单词。常用的方法有如下几种:public String nextToken();功能:逐个获取字符串中的单词并返回该字符串。public String nextToken(String delim)功能:以 delim 作为分隔符逐个获取字符串中的单词并返回该字符串。public int countTokens()功能:返回单词计数器的。public boolean hasMoreTokens();功能:检测字符串中是否还有单词,如果还有单词,则返回 true,否则返回 false。6下列程序输出的结果是什么 import.*;public class Hello public static void main(String args)String s=Friday;SaturdaySunday Monday,Tuesday;StringTokenizer stk=new StringTokenizer(s,;);while()解:输出的结果是:Friday Saturday Sunday Monday,Tuesday 7编写程序,在命令行输入 java 类文件名 11 24 62 73 103 56,求这一串数字的最大值和平均数。解:public class Hello public static void main(String args)double total=0;int max=0;for(int i=0;i;i+)total=total+(argsi);if(max (argsi)max=(argsi);8编写程序,输入两个字符串,完成以下几个功能:(1)求出两个字符串的长度。(2)检验第一个串是否为第二个串的子串。(3)把第一个串转化为 byte 类型并输出。解:import import.*;public class Hello public static void main(String args)Scanner scan=new Scanner;请输入字符1);String str1=();请输入字符2);String str2=();if(str1)=-1)字符串1不是字符串2的子串);else 字符串1是字符串2的子串);byte b=();for(int i=0;i();i+)第 8 章 1 Java为什么要引入线程机制线程的概念是什么线程和进程的区别是什么解释什么是Java的多线程 答:Java 之所以引入线程机制是因为:线程间的通信非常简单且有效,上下文切换非常快,它们是同一个进程中的两部分之进行的切换,每个线程彼此独立执行,一个程序可以同时使用多个线程来完成不同的任务。所谓线程是指进程中单一顺序的执行流。进程是一个动态执行的程序,当你运行一个程序的时候,就创建了一个用来容纳组成代码和数据空间的进程。每一个进程都有自己的一块内存空间和一组系统资源,它们之间都是独立的。线程可以共享内存单元和系统资源,但不能够单独执行,必须存在于某个进程当中。它是比进程更小的能独立运行的基本单位。Java 中的线程由虚拟的 CPU、CPU 所执行的代码和 CPU 所处理的数据三部分组成。Java 的多线程就是系统每次给 Java 程序一个 CPU 时间,Java 虚拟处理机在多个线程之间轮流切换,保证每个线程都能机会使用 CPU 资源,不过每个时刻只能有一个线程在执行。2线程创建方式有哪两种请举例说明。答:两种途径来实现多线程的创建:一种是直接继承 Thread 类并重写其中的 run()方法,另一种是使用 Runnable 接口。途径一:class SimpleThread extends Thread private String threadname;public SimpleThread(String str)threadname=str;public void run()for(int i=0;i 10;i+)被调用!);try sleep(10);catch(InterruptedException e)途径二:class SimpleThread implements Runnable public SimpleThread(String str)super(str);public void run()for(int i=0;i 10;i+)被调用!);try (10);catch(InterruptedException e)3什么是线程的生命期它包括哪几种状态它们的关系是什么 答:线程的生命期是指从线程被创建开始到死亡的过程,通常包括 5 种状态:新建、就绪、运行、阻塞、死亡。它们的关系如图所示:新建状态死亡状态运行状态阻塞状态New Thread()start()stop()就绪状态stop()stop()run()结束wait()、sleep()、suspend()等阻塞消除调度时间片结束或调用yield()4请举例说明如何实现线程的同步(用两种方法)。方法一(方法同步):class Stack private int number;private int len=0;public synchronized void put(int t)while(len=1)try ();catch(InterruptedException e)number=t;len=1;();public synchronized int get()while(len=0)try ();catch(InterruptedException e)len=0;();return number;方法二(对象同步):class Stack private int number;private int len=0;public void put(int t)synchronized(this)while(len=1)try ();catch(InterruptedException e)number=t;len=1;();public int get()synchronized(this)while(len=0)try ();catch(InterruptedException e)len=0;();return number;class Input implements Runnable Stack sstack;public Input(Stack s)sstack=s;public void run()for(int i=1;i5;i+)(i);向Stack放入数字:+i);try (int)()*10);catch(InterruptedException e)class Output implements Runnable Stack sstack;public Output(Stack s)sstack=s;public void run()int temp;for(int i=1;i5;i+)temp=