Java面向对象程序设计习题解答耿祥义.docx
《Java面向对象程序设计习题解答耿祥义.docx》由会员分享,可在线阅读,更多相关《Java面向对象程序设计习题解答耿祥义.docx(51页珍藏版)》请在冰豆网上搜索。
Java面向对象程序设计习题解答耿祥义
书后习题参考答案
习题1
1.JamesGosling
2.
(1)使用一个文本编辑器编写源文件。
(2)使用Java编译器(javac.exe)编译Java源程序,得到字节码文件。
命令:
javac–d.文件名称.java
(3)使用Java解释器(java.exe)运行Java程序。
命令:
java包名.类名
3.Java的源文件是由若干个书写形式互相独立的类、接口、枚举等组成。
应用程序中可以没有public类,若有的话至多可以有一个public类。
4.新建JAVA_HOME系统环境变量,指向安装目录
在系统环境变量path中增加内容:
%JAVA_HOME%\bin;
新建系统环境变量classpath并填入三项:
.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
5.B
6.Java源文件的扩展名是.java。
Java字节码的扩展名是.class。
7.D
8.
(1)Speak.java
(2)生成两个字节码文件,这些字节码文件的名字Speak.class和Xiti8.class
(3)javaXiti8
(4)执行javaSpeak的错误提示
Exceptioninthread"main"java.lang.NoSuchMethodError:
main
执行javaxiti8得到的错误提示
Exceptioninthread"main"java.lang.NoClassDefFoundError:
xiti8(wrongname:
Xiti8)
执行javaXiti8.class得到的错误提示
Exceptioninthread"main"java.lang.NoClassDefFoundError:
Xiti8/class
执行javaXiti8得到的输出结果
I'mgladtomeetyou
9.属于操作题,解答略。
习题2
1.BD
2.【代码1】【代码2】错误//【代码3】更正为floatz=6.89F;
3.float型常量后面必须要有后缀“f”或“F”。
对于double常量,后面可以有后缀“d”或“D”,但允许省略该后缀。
4.publicclassXiti4{
publicstaticvoidmain(Stringargs[]){
charch1='你',ch2='我',ch3='他';
System.out.println("\""+ch1+"\"的位置:
"+(int)ch1);
System.out.println("\""+ch2+"\"的位置:
"+(int)ch2);
System.out.println("\""+ch3+"\"的位置:
"+(int)ch3);
}
}
5.数组名字.length
6.数组名字.length
7.
【代码1】A,65
【代码2】-127
【代码3】123456.783,123456.78312
8.
【代码1】false
【代码2】true
【代码3】false
【代码4】3
【代码5】4.4
【代码6】8.8
习题3
1.输出110if-else语句书写的不够规范,复合语句缺少大括号“{}”,代码不够清晰。
2.你好好酷!
!
3.publicclassXiti3_3{
publicstaticvoidmain(Stringargs[]){
intstartPosition=0,endPosition=0;
charcStart='а',cEnd='я';
startPosition=(int)cStart;//cStart做int型转换,结果赋给startPosition
endPosition=(int)cEnd;//cEnd做int型转换运算,结果赋给endPosition
System.out.println("俄文字母表:
");
for(inti=startPosition;i<=endPosition;i++){
charc='\0';
c=(char)i;//i做char型转换运算,并将结果赋值给c
System.out.print(""+c);
//System.out.print(""+c+""+Integer.toHexString(c));
if((i–startPosition+1)%10==0){
System.out.println();
2
6
24
120
720
5040
40320
362880
3628800
39916800
479001600
6227020800
87178291200
130********00
20922789888000
355687428096000
6402373705728000
121645*********000
2432902008176640000
-4249290049419214848
sum=2561327494111820313
1!
=1
2!
=2
3!
=6
4!
=24
5!
=120
6!
=720
7!
=5040
8!
=40320
9!
=362880
10!
=3628800
11!
=39916800
12!
=479001600
13!
=6227020800
14!
=87178291200
15!
=130********00
16!
=20922789888000
17!
=355687428096000
18!
=6402373705728000
19!
=121645*********000
20!
=2432902008176640000
sum=2561327494111820313
}
}
}
}
4.随书给出的解答:
publicclassXiti4{
publicstaticvoidmain(String
args[]){
doublesum=0,a=1;
inti=1;
while(i<=20){
sum=sum+a;
i++;
a=a*i;
}
System.out.println("sum="+sum);
}
}
结果:
sum=2.5613274941118203E18如果sum改成long的情况?
?
?
精确计算的方法:
[书P201有类似操作]
BigIntegersum=newBigInteger("0");
BigIntegerfactorial=newBigInteger("1");
for(inti=0;i<20;){
i++;
factorial=factorial.multiply(newBigInteger(String.valueOf(i)));
System.out.println(i+"!
="+factorial);
sum=sum.add(factorial);
}
System.out.println("sum="+sum);//256-1327-4941-1182-0313
//System.out.println(Long.MAX_VALUE);922-3372-0368-5477-5807
5.
classXiti5{
publicstaticvoidmain(Stringargs[]){
for(intj=2;j<=100;j++){
inti=0;
for(i=2;i<=j/2;i++){
if(j%i==0)
break;
}
if(i>j/2){
System.out.print(""+j);
}
}
}
}
6.
classXiti6{
publicstaticvoidmain(Stringargs[]){
doublesum=0;
doublereciprocalFactorial=1;
for(inti=1;i<=20;i++){
reciprocalFactorial=reciprocalFactorial*(1.0/i);
sum=sum+reciprocalFactorial;
}
System.out.println("使用for循环计算的sum="+sum);
inti=1;
sum=0;
reciprocalFactorial=1;
while(i<=20){
sum=sum+reciprocalFactorial;
i++;
reciprocalFactorial=(1.0/i)*reciprocalFactorial;
}
System.out.println("使用while循环计算的sum="+sum);
}
}
7.
classXiti7{
publicstaticvoidmain(Stringargs[]){
for(inti=1;i<=1000;i++){
intsum=0;
//System.out.print(i+"因子");
for(intj=1;j
if(i%j==0){
//System.out.print(""+j);
sum=sum+j;
}
}
//System.out.println("因子的和"+sum);
if(sum==i){
System.out.println("完数:
"+i);
}
}
}
}
8.
importjava.util.Scanner;
publicclassXiti8{
publicstaticvoidmain(Stringargs[]){
method1();
method2();
}
privatestaticvoidmethod1(){
System.out.println("请输入两个非零正整数,每输入一个数回车确认");
Scannerreader=newScanner(System.in);
intm=0,n=0,temp=0,gy=0,gb=0,a,b;
a=m=reader.nextInt();
b=n=reader.nextInt();
if(mtemp=m;
m=n;
n=temp;
}
intr=m%n;
while(r!
=0){
n=m;
m=r;
r=m%n;
}
gy=n;
gb=a*b/gy;
System.out.println("最大公约数:
"+gy);
System.out.println("最小公倍数:
"+gb);
}
privatestaticvoidmethod2(){
System.out.println("请输入两个非零正整数,每输入一个数回车确认");
Scannerreader=newScanner(System.in);
intm=0,n=0,t=0,gy=0,gb=0;
m=reader.nextInt();
n=reader.nextInt();
if(m>n){
t=m;
m=n;
n=t;
}
for(inti=1;i<=m;i++){
if(m%i==0&&n%i==0){
gy=i;
}
}
gb=m*n/gy;
System.out.println(m+","+n+"的最大公约数为"+gy);
System.out.println(m+","+n+"的最小公倍数为"+gb);
}
}
f
(1)=1
f
(2)=3
f(3)=9
f(4)=33
f(5)=153
f(6)=873
f(7)=5913
f(8)=46233
满足条件的最大整数:
7
满足条件的最大整数:
7
9.
publicclassXiti9{
publicstaticvoidmain(Stringargs[]){
method1();
method2();
}
privatestaticvoidmethod1(){
intendNumber=9999;
for(inti=1,factorial=1,sum=0;;i++){
factorial*=i;
sum=sum+factorial;
System.out.println("f("+i+")="+sum);
if(sum>endNumber){
System.out.println("满足条件的最大整数:
"+(i-1));
break;
}
}
}
privatestaticvoidmethod2(){//书中提供的方法实现
intn=1;
longsum=0,t=1;
t=n*t;
while(true){
sum=sum+t;
if(sum>9999)
break;
n++;
t=n*t;
}
System.out.println("满足条件的最大整数:
"+(n-1));
}
}//1至7的阶乘和是sum=5913//1至8的阶乘和是sum=46233
习题4
1.用该类创建对象时。
2.所谓方法重载是在一个类中或父子类中可以有多个方法具有相同的名字,但这些方法的参数必须不同,即或者是参数的个数不同,或者是参数的类型不同。
构造方法可以重载。
3.可以。
不可以。
4.不可以。
5.成员变量又分为实例变量和类变量,用static修饰的变量是类变量。
那么类变量和实例变量有什么区别呢?
一个类通过使用new运算符可以创建多个不同的对象,不同的对象的实例变量将被分配不同的内存空间;如果类中的成员变量有类变量,那么所有对象的这个类变量都分配给相同的一处内存,改变其中一个对象的这个类变量会影响其它对象的这个类变量。
也就是说对象共享类变量。
6.C,D看类声明在什么地方,顶级类只有public或不加两个修饰,而内部类可以有四个修饰。
7.【代码1】,【代码4】
8.sum=-100
9.27
10.**20##100
习题5
1.
如果子类和父类在同一个包中,那么子类自然地继承了其父类中不是private的成员变量作为自己的成员变量,并且也自然地继承了父类中不是private的方法作为自己的方法。
继承的成员或方法的访问权限保持不变。
如果子类和父类不在同一个包中,那么子类继承了父类的protected、public成员变量做为子类的成员变量,并且继承了父类的protected、public方法为子类的方法,继承的成员或方法的访问权限保持不变。
如果子类和父类不在同一个包里,子类不能继承父类的友好变量和友好方法。
只要子类中声明的成员变量和父类中的成员变量同名时,子类就隐藏了继承的成员变量。
子类中定义一个方法,这个方法的类型和父类的方法的类型一致或者是父类的方法的类型的子类型,并且这个方法的名字、参数个数、参数的类型和父类的方法完全相同,子类如此定义的方法称作子类重写的方法。
子类通过方法的重写可以隐藏继承的方法。
重写的规定不仅仅如此,访问权限、抛出异常、方法类型都有规定。
2.不可以。
3.abstract类。
4.假设B类是A类子类或间接子类,当我们用子类B创建一个对象,并把这个对象的引用放到A类的对象中时,称这个A类对象是子类对象的上转型对象。
父引用指向字对象。
5.可以把实现某一接口的类创建的对象的引用赋给该接口声明的接口变量中。
那么该接口变量就可以调用被类实现的接口中的方法。
6.A,C,D正确答案ADC不正确
7.15.08.0
8.98.012
9.
classA{
publicfinalvoidf(){
charcStart='a',cEnd='z';
for(charc=cStart;c<=cEnd;c++){
System.out.print(""+c);
}
}
}
classBextendsA{
publicvoidg(){
charcStart='α',cEnd='ω';
for(charc=cStart;c<=cEnd;c++){
System.out.print(""+c);
}
}
}
publicclassXiti9{
publicstaticvoidmain(Stringargs[]){
Bb=newB();
b.f();
b.g();
}
}
10.
classA{
publicintf(inta,intb){
if(binttemp=0;
temp=a;
a=b;
b=temp;
}
intr=b%a;
while(r!
=0){
b=a;
a=r;
r=b%a;
}
returna;
}
}
classBextendsA{
publicintf(inta,intb){
intdivision=super.f(a,b);
return(a*b)/division;
}
}
publicclassXiti10{
publicstaticvoidmain(Stringargs[]){
Aa=newA();
Bb=newB();
System.out.println("最大公约数:
"+a.f(36,24));
System.out.println("最小公倍数:
"+b.f(36,24));
}
}
习题6
1.仍然有效。
2.可以。
3.不可以。
区分情况,静态内部类可以有。
4.大家好,祝工作顺利!
5.96乘数超过99
习题7
1.
(1)Strategy是接口。
(2)Army不是抽象类。
(3)Army和Strategy是关联关系。
(4)StrategyA,StrategyB、StrategyC与Strategy是实现关系。
2.
3.
4.例子13的设计符合开-闭原则。
5.例子17的设计符合开-闭原则。
习题9
1.A,B,D
2.Love:
Game
3.13abc夏日
4.13579
5.9javaHello
6.
publicclassXiti6{
publicstaticvoidmain(Stringargs[]){
Strings1,s2,s3,t1="ABCDabcd";
System.out.println("字符串原来是这个样子:
"+t1);
s1=t1.toUpperCase();
System.out.println("字符串中的小写字母变成大写是这个样子:
"+s1);
s2=t1.toLowerCase();
System.out.println("字符串中的大写字母变成小写是这个样子:
"+s2);
s3=s1.concat(s2);
System.out.println("大写字符串连接小写字符串是这个样子:
"+s3);
}
}
7.
classXiti7{
publicstaticvoidmain(Stringargs[]){
Strings="中华人民共和国";
chara=s.charAt(0);
charb=s.charAt(6);
System.out.println("第一个字符:
"+a);
System.out.println("最后一个字符:
"+b);
}
}
8.
importjava.util.*;
classXiti8{
publicstaticvoidmain(Stringargs[]){
intyear,month;
System.out.println("请输入年份和月份,每输入一个数回车确认");
Scannerreader=newScanner(System.in);
year=reader.nextInt();
month=reader.nextInt();
String[]day=newString[42];
System.out.println("日一二三四五六");
Calendarrili=Calendar.getInstance();
rili.set(year,month-1,1);//将日历翻到year年month月1日,注意0表示一月...11表示十二月
int星期几=rili.get(Calendar.DAY_OF_WEEK)-1;
intdayAmount=0;