Java面向对象程序设计
清华大学出版社
(编著 耿祥义 张跃平)
习题解答
建议使用文档结构图
(选择Word菜单→视图→文档结构图)
习题1
1.James Gosling
2.
(1)使用一个文本编辑器编写源文件。
(2)使用Java编译器(javac.exe)编译Java源程序,得到字节码文件。
(3)使用Java解释器(java.exe)运行Java程序
3.Java的源文件是由若干个书写形式互相独立的类组成的。
应用程序中可以没有public类,若有的话至多可以有一个public类。
4.系统环境path D\jdk\bin
系统环境classpath D\jdk\jre\lib\rt.jar.
5. B
6. Java源文件的扩展名是.java。Java字节码的扩展名是.class。
7. D
8.(1)Speak.java
(2)生成两个字节码文件,这些字节码文件的名字Speak.class 和 Xiti8.class
(3)java Xiti8
(4)执行java Speak的错误提示
Exception in thread "main" java.lang.NoSuchMethodError: main
执行java xiti8得到的错误提示
Exception in thread "main" java.lang.NoClassDefFoundError: xiti8 (wrong name: Xiti8)
执行java Xiti8.class得到的错误提示
Exception in thread "main" java.lang.NoClassDefFoundError: Xiti8/class
执行java Xiti8得到的输出结果
I'm glad to meet you
9.属于 *** 作题,解答略。
习题2
1. D
2.【代码1】 【代码2】 错误 //【代码3】更正为 float z=6.89F
3.float型常量后面必须要有后缀“f”或“F”。
对于double常量,后面可以有后缀“d”或“D”,但允许省略该后缀。
4.public class Xiti4{
public static void main (String args[ ]){
char ch1='你',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
输出110
if-else语句书写的不够规范,复合语句缺少大括号“{}”,代码不够清晰。
2.你好好酷!!
3.
public class Xiti3_3
{
public static void main (String args[ ]){
int startPosition=0,endPosition=0
char cStart='а',cEnd='я'
startPosition=(int)cStart //cStart做int型转换据运算,并将结果赋值给startPosition
endPosition=(int)cEnd //cEnd做int型转换运算,并将结果赋值给endPosition
System.out.println("俄文字母表:")
for(int i=startPositioni<=endPositioni++){
char c='\0'
c=(char)i //i做char型转换运算,并将结果赋值给c
System.out.print(" "+c)
if((i-startPosition+1)%10==0)
System.out.println("")
}
}
}
4.
public class Xiti4
{ public static void main(String args[])
{ double sum=0,a=1
int i=1
while(i<=20)
{ sum=sum+a
i++
a=a*i
}
System.out.println("sum="+sum)
}
}
5.
class Xiti5
{ public static void main(String args[])
{ int i,j
for(j=2j<=100j++)
{ for(i=2i<=j/2i++)
{ if(j%i==0)
break
}
if(i>j/2)
{ System.out.print(" "+j)
}
}
}
}
6.
class Xiti6
{ public static void main(String args[])
{ double sum=0,a=1,i=1
while(i<=20)
{ sum=sum+a
i++
a=(1.0/i)*a
}
System.out.println("使用while循环计算的sum="+sum)
for(sum=0,i=1,a=1i<=20i++)
{ a=a*(1.0/i)
sum=sum+a
}
System.out.println("使用for循环计算的sum="+sum)
}
}
7.
public class Xiti7
{ public static void main(String args[])
{ int sum=0,i,j
for(i=1i<=1000i++)
{ for(j=1,sum=0j<ij++)
{ if(i%j==0)
sum=sum+j
}
if(sum==i)
System.out.println("完数:"+i)
}
}
}
8.方法之一
import java.util.Scanner
public class Xiti8
{ public static void main (String args[ ]){
System.out.println("请输入两个非零正整数,每输入一个数回车确认")
Scanner reader=new Scanner(System.in)
int m=0,n=0,temp=0,gy=0,gb=0,a,b
a=m = reader.nextInt()
b=n = reader.nextInt()
if(m<n)
{ temp=m
m=n
n=temp
}
int r=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)
}
}
8.方法之二
import java.util.Scanner
public class Xiti8 {
public static void main (String args[ ]){
System.out.println("请输入两个非零正整数,每输入一个数回车确认")
Scanner reader=new Scanner(System.in)
int m=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(int i=1i<=mi++){
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)
}
}
9.
public class Xiti9
{ public static void main(String args[])
{ int n=1
long sum=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.0// 1至8的阶乘和是sum=46233.0
习题4
1.用该类创建对象时。
2.所谓方法重载是在一个类中可以有多个方法具有相同的名字,但这些方法的参数必须不同,即或者是参数的个数不同,或者是参数的类型不同。构造方法可以重载。
3. 可以。不可以。
4.不可以。
5.成员变量又分为实例变量和类变量,用static修饰的变量是类变量。那么类变量和实例变量有什么区别呢?一个类通过使用new运算符可以创建多个不同的对象,不同的对象的实例变量将被分配不同的内存空间;如果类中的成员变量有类变量,那么所有对象的这个类变量都分配给相同的一处内存,改变其中一个对象的这个类变量会影响其它对象的这个类变量。也就是说对象共享类变量。
6.C,D
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
7.15.0
8.0
8.98.0
12
9.
class A
{ public final void f()
{ char cStart='a',cEnd='z'
for(char c=cStartc<=cEndc++)
{ System.out.print(" "+c)
}
}
}
class B extends A
{ public void g()
{ char cStart='α',cEnd='ω'
for(char c=cStartc<=cEndc++)
{ System.out.print(" "+c)
}
}
}
public class Xiti9
{ public static void main (String args[ ])
{ B b=new B()
b.f()
b.g()
}
}
10.
class A
{ public int f(int a,int b){
if(b<a)
{ int temp=0
temp=a
a=b
b=temp
}
int r=b%a
while(r!=0)
{ b=a
a=r
r=b%a
}
return a
}
}
class B extends A
{ public int f(int a,int b)
{ int division=super.f(a,b)
return (a*b)/division
}
}
public class Xiti10
{ public static void main (String args[ ])
{ A a=new A()
B b=new B()
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的设计符合开-闭原则。
习题8
采用新增的策略为选手计算得分。
增加新的具体策略StrategyFour。StrategyFour类将double computeScore(double [] a)方法实现为去掉数组a的元素中的一个最大值和一个最小值,然后计算剩余元素的几何平均值。
import java.util.Arrays
public class StrategyFour implements ComputableStrategy {
public double computeScore(double [] a) {
if(a.length<=2)
return 0
double score=0,multi=1
Arrays.sort(a)
int n=a.length-2
for(int i=1i<a.length-1i++) {
multi=multi*a[i]
}
score=Math.pow(multi,1.0/n)
return score
}
}
2.
(1)策略(Strategy)PrintCharacter.java
public interface PrintCharacter{
public abstract void printTable(char [] a,char[] b)
}
(2) 具体策略
PrintStrategyOne.java
public class PrintStrategyOne implements PrintCharacter {
public void printTable(char [] a,char[] b) {
for(int i=0i<a.lengthi++) {
System.out.print(a[i]+",")
}
for(int i=0i<b.lengthi++) {
System.out.print(b[i]+",")
}
System.out.println("")
}
}
PrintStrategyTwo.java
public class PrintStrategyTwo implements PrintCharacter {
public void printTable(char [] a,char[] b) {
for(int i=0i<a.lengthi++) {
System.out.print(b[i]+","+a[i]+",")
}
}
}
(3)上下文 PrintGame.java
public class PrintGame {
PrintCharacter strategy
public void setStrategy(PrintCharacter strategy) {
this.strategy=strategy
}
public void getPersonScore(char[] a,char[] b){
if(strategy==null)
System.out.println("sorry!")
else
strategy.printTable(a,b)
}
}
应用以上策略:
public class Application {
public static void main(String args[]) {
char [] a=new char[26]
char [] b=new char[26]
for(int i=0i<=25i++){
a[i]=(char)('a'+i)
}
for(int i=0i<=25i++){
b[i]=(char)('A'+i)
}
PrintGame game=new PrintGame() //上下文对象
game.setStrategy(new PrintStrategyOne()) //上下文对象使用策略一
System.out.println("方案1:")
game.getPersonScore(a,b)
game.setStrategy(new PrintStrategyTwo()) //上下文对象使用策略二
System.out.println("方案2:")
game.getPersonScore(a,b)
}
}
3.参照本章8.3.3自主完成。
习题9
1.A,B,D
2. Love:Game
3.13
abc夏日
4.13579
5.9javaHello
6.
public class Xiti6 {
public static void main (String args[ ]) {
String s1,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.
class Xiti7
{ public static void main(String args[ ])
{ String s ="中华人民共和国"
char a=s.charAt(0)
char b=s.charAt(6)
System.out.println("第一个字符: "+a)
System.out.println("最后一个字符: "+b)
}
}
8.
import java.util.*
class Xiti8
{ public static void main(String args[]){
int year,month
System.out.println("请输入年份和月份,每输入一个数回车确认")
Scanner reader=new Scanner(System.in)
year= reader.nextInt()
month= reader.nextInt()
String [] day=new String[42]
System.out.println(" 日 一 二 三 四 五 六")
Calendar rili=Calendar.getInstance()
rili.set(year,month-1,1)//将日历翻到year年month月1日,注意0表示一月...11表示十二月
int 星期几=rili.get(Calendar.DAY_OF_WEEK)-1
int dayAmount=0
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
dayAmount=31
if(month==4||month==6||month==9||month==11)
dayAmount=30
if(month==2)
if(((year%4==0)&&(year%100!=0))||(year%400==0))
dayAmount=29
else
dayAmount=28
for(int i=0i<星期几i++)
day[i]=""
for(int i=星期几,n=1i<星期几+dayAmounti++){
if(n<=9)
day[i]=String.valueOf(n)+" "
else
day[i]=String.valueOf(n)
n++
}
for(int i=星期几+dayAmounti<42i++)
day[i]=""
for(int i=0i<星期几i++)
{ day[i]="**"
}
for(int i=0i<day.lengthi++)
{ if(i%7==0)
{ System.out.println("")
}
System.out.print(" "+day[i])
}
}
}
9.
import java.util.*
class Xiti9
{ public static void main(String args[]){
int year1,month1,day1,year2,month2,day2
Scanner reader=new Scanner(System.in)
System.out.println("请输入第一个日期的年份 月份 日期 ,每输入一个数回车确认")
year1= reader.nextInt()
month1= reader.nextInt()
day1= reader.nextInt()
System.out.println("请输入第二个日期的年份 月份 日期 ,每输入一个数回车确认")
year2= reader.nextInt()
month2= reader.nextInt()
day2= reader.nextInt()
Calendar calendar=Calendar.getInstance()
calendar.set(year1,month1,day1)
long timeYear1=calendar.getTimeInMillis()
calendar.set(year2,month2,day2)
long timeYear2=calendar.getTimeInMillis()
long 相隔天数=Math.abs((timeYear1-timeYear2)/(1000*60*60*24))
System.out.println(""+year1+"年"+month1+"月"+day1+"日和"+
year2+"年"+month2+"月"+day2+"日相隔"+相隔天数+"天")
}
}
全部都给你
希望那个可以帮助到你 祝你学习成功
c语言程序设计第二版是什么垃圾谭浩强《C语言程序设计(第二版)》的前50页中的错误分析
谭书也算是一本奇书了,据说已经发行了300多万册。这本书真的那么好吗?师长早有教诲,因此本人从来没有好好读过谭书。近日遇周围人盛赞谭书,非辩论不可。虽本人不愿应战,但也不得已将谭书找来翻翻。随便翻了一段,就发现错误百出,在此将其中最前面的一些整理出来,提出与国内广大
行家和新入道者讨论,望行家们提出批评,供新入道者参考。
书中程序的不规范性、不良的格式和低劣的编程都不在这里深究了。实在是太多,要深究、分析和改
正起来,必须写一本数倍于谭书的大作,本人实在没这个时间和精力。水平高的人有的是,欢迎写几
个续篇。欢迎转载到其他BBS,以期引起讨论。对本人所言的不实之处欢迎批评。
注:下面将作者尊称为“谭先生”。负的行号表示一页里倒数的行数。
--------------------------------------------------------------
先看目录,是不是有个地放有:
"淡函数………………………………",什么东西,这算是排版错误,不理会!
P1行1:…,它适于作为系统描述语言,…
这开宗明义的第一句话就说明谭先生对于计算机科
学的术语不甚了了。什么叫“系统描述”,什么叫“系统程序设计”?人们都都说C是一种“系统程
序设计语言”,而“系统描述语言”则完全是另一种东西。想必谭先生对它们之间的差异和关系都不
清楚。在这种情况下就来下断言,一上马就露了怯。
P2表格:if (e) S
这个错误说明谭先生对C语句基本结构也不清楚。在C语言里,分号是普通语句的结束符号,是语句
的一部分。如果谭先生的S表示语句,那么后随的分号是必需的吗?如果谭先生的S表示语句中分号
前面的一部分,那么又如何理解可以放在这里的{ ... } 顺序结构呢?它算语句吗?可以放在这里
吗?要加分号吗?无论怎么看,谭先生都难以自圆其说!
P3行4:C语言是理想的结构化语言,…
不知谭先生的这个论断由何而来。C的创造者肯定不会说这句话,即使是C语言最狂热的崇拜者恐怕
也不敢这样说。幸亏谭先生生在中国,其书只在中国出版,否则恐怕他就不会好过了,不知有多少人
要找谭先生理论个究竟。
P3行7-8:例如整型量与字符型数据以及逻辑型数据可以通用。
此句子表现出的语文水平就不深究了。要问谭先生的简单问题是,“量”与“数据”是什么关系?再
一个问题是,C语言什么时候增加了“逻辑型数据”?
P3行14:C语言允许直接访问物理地址。
不知这个论断从何而来。至少无法从C语言参考手册中找到根据,看来是谭先生为C语言增加的特殊功能。
P4程序:This is a c program.
通观世界上所有有关C语言的重要著作,C语言的名字“C”都是用大写表示。这里好象谭先生表示了
对C的不肖,与前面大相径庭,不知何故。P5行9:注释可以出现在程序中的任何位置。
这里又修改了C语言的规则。这里给谭先生提个小问题:“请找出在C程序里不能出现注释的位置(
或说,加了注释就会改变程序意义的位置)。”请10秒钟内回答。
P5行12:“%d”表示“十进制整数类型”。
写程序有问题呀!怎么一遇到具体问题,写出的解释到处都是毛病。“%d”根本就不表示任何类型,
它只是对函数printf提出一个转换要求。如果一个初学者产生这种理解偏差还有情可言,像谭先生这
样的“大师”级人物也犯此等低级错误,实在是不可原谅。
P5行-8:scanf和printf都是C语言提供的标准输入输出函数…
按本人理解,C语言本身不提供任何有关输入输出的功能,也不提供任何标准函数。只是ANSI C建议
了一个标准函数库。至少C参考手册上是这么说的,在谭书中其他部分也这么说。概念不太清楚就容
易漏马脚。
P6行13:可以说C是函数式的语言。
太荒唐了,完全是望文生义。谭先生的计算机科学技术知识水平可见一斑。函数式语言是计算机科学
领域中有明确意义的术语。再者说,即使不理解,也应该尽量回避一下大家都知道的东西,这下不就
漏了底。说C是函数式语言,就像说谭先生是“错话大师”一样(毕竟他也说了许多对的话嘛!)。
看来谭先生需要补一补计算机科学的基础知识,听说谭先生是清华大学毕业,那里的计算机系也还不
错嘛。
没有基础的人看翻译过后的书有时会觉得很难理解,我建议你先找一个懂JAVA的人让他花个把小时给你粗略说一说,或实际 *** 作一把,比如如何配环境变量,如何编译。最好拿着《Thinking In JAVA》说,这样过后你自己也能看了。毕竟这本书还是必读的。然后我认为初学必看的书还有
《面向对象程序设计基础》
API中文帮助文档
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)