1、Java 语言程序设计第四章课后习题答案1.子类将继承父类所有的属性和方法吗?为什么?答:不,子类不能直接访问从父类中继承的私有属性及方法,但可以对公有及保护方法进行访问。2.方法的覆盖与方法的重载有何不同?答:覆盖是运用在子类中实现与父类相同的功能,但采用不同的算法或公式;在名字相同的方法中,要做比父类更多的事情;在子类中需要取消从父类继承的方法。3.声明两个带有无参构造方法的两个类 A 和 B,声明 A 的子类 C,并且声明 B 为 C 的一个成员,不声明 C 的构造方法。编写测试代码,生成类 C 的实例对象,并观察结果。/A 类public class A public A () Sys
2、tem.out.println (“输出 A 类“);/B 类public class B public B () System.out.println (“输出 B 类“);/C 类public class C extends A B b = new B ();/测试类public class test4_3 public static void main (String args) C c = new C();运行结果:4.声明一个基类 A,它只有一种非默认构造方法;声明 A 的子类 B,B 具有默认方法及非默认方法,并在 B 的构造方法中调用基类 A 的构造方法。/A 类public c
3、lass A public A (String lin) System.out.println(“A类的非默认构造方法 “+lin);/B 类public class B extends Apublic B () super (“Fuck your teacher“);System.out.println (“B默认类构造方法“ );public B (String lin) super (lin);System.out.println (“B类非构造方法“ );/测试类public class test4_4 public static void main (String args) new
4、 B();System.out.println ();new B(“Fuck my teacher“);运行结果:5.声明一个类,它具有一种方法,此方法被重载三次,派生一个新类,并增加一种新的重载方法,编写测试类验证四种方法对于派生类验证四种方法对于派生类都有效。/A 类public class A public void showTime () System.out.println (“空重载“);public void showTime (int l) System.out.println (“整形参数重载“);public void showTime (char l) System.ou
5、t.println (“字符参数重载“);/B 类public class B extends A public void showTime (String l) System.out.println (“字符串参数重载“);/测试类public class test4_5 public static void main (String args) B b = new B();b.showTime();b.showTime(5);b.showTime(f);b.showTime(“林楚金“);6.声明一个具有 final 方法的类,声明一个派生类,并试图对这个方法进行重写,会有什么结果。/A
6、类public class A public final void showTime() System.out.println (“类 A 中方法“); /B 类public class B extends Apublic void showTime() System.out.println (“类 B 中方法“);/测试类public class test4_6 public static void main (String args) B b = new B();b.showTime();运行结果:(说白了就是 B 中 showTime()的无法覆盖 A 中 showTime(),被覆盖为
7、 final,不能覆盖。 )7.声明一个 final 类,并试图声明其派生类,会有什么结果。/A 类public final class A /B 类public class B extends A/测试类public class test4_7 public static void main (String args) B b = new B();运行结果:(说白了就是无法从 A 中进行继承)8.什么是抽象类?抽象类中是否一定要包括抽象方法?答:抽象类是一个不完全的类,不能使用 new 方法进行实例化。抽象类可以包含抽象方法,也可以不包含抽象方法,但有抽象方法的必须是抽象类。9.this 和
8、 super 分别有哪些特殊含义?都有哪些种用法?答:this 表示当前类;super 表示调用父类。在定义类的时候用到,this 是当前对象的引用,super 是当前对象的父类对象的引用,一般的都是把 super 用在构造函数中。10.完成下面父类及子类的声明:(1) 声明 Student 类属性包括学号、姓名、英语成绩、数学成绩、计算机成绩和总成绩。方法包括构造方法、get 方法、 set 方法、toString 方法、equals 方法、compare 方法(比较两个学生的总成绩,结果分为大于、小于、等于) ,sum 方法(计算总成绩)和 testScore方法(计算评测成绩) 。注:评
9、测成绩可以取三门课成绩的平均分,另外任何一门课的成绩的改变都需要对总成绩进行重新计算,因此,在每一个 set 方法中应调用 sum 方法计算总成绩。public class StudentString id;String name;float scoreOfenglish;float scoreOfmath;float scoreOfcomputer;float scoreOfsum;/构造方法public Student()public Student(String aid,String aname,float ascoreOfenglish,float ascoreOfmath,float
10、 ascoreOfcomputer)this.id=aid;this.name=aname;this.scoreOfenglish=ascoreOfenglish;this.scoreOfmath=ascoreOfmath;this.scoreOfcomputer=ascoreOfcomputer;/this.scoreOfsum=ascoreOfenglish+ascoreOfmath+ascoreOfcomputer;this.scoreOfsum=sum();/sum 方法public float sum()return(this.scoreOfenglish+this.scoreOfm
11、ath+this.scoreOfcomputer);/testScore 测评成绩 /平均分public float testScore()return(this.scoreOfsum/3);/6 个 get 方法 public String getid()return(id);public String getname()return(name);public float getscoreOfenglish()return(scoreOfenglish);public float getscoreOfmath()return(scoreOfmath);public float getscor
12、eOfcomputer()return(scoreOfcomputer);public float getscoreOfsum()return(scoreOfsum);/5 个 set 方法public void setid(String newid)this.id=newid;public void setname(String newname)this.name=newname;public void setscoreOfenglish(float newscoreOfenglish)this.scoreOfenglish=newscoreOfenglish;this.scoreOfsum
13、=sum();public void setscoreOfmath(float newscoreOfmath)this.scoreOfmath=newscoreOfmath;this.scoreOfsum=sum();public void setscoreOfcomputer(float newscoreOfcomputer)this.scoreOfcomputer=newscoreOfcomputer;this.scoreOfsum=sum();/toString 方法public String toString()return(“学号:“+this.id+“n 姓名:“+name+“n
14、英语:“+this.scoreOfenglish+“n 数学:“+this.scoreOfmath+“n 计算机:“+this.scoreOfcomputer+“n 总分:“+this.scoreOfsum);/compare 方法/比较 2 学生总分public void compare(Student x)if(this.getscoreOfsum()x.getscoreOfsum()System.out.println(this.getname()+“总分大于“+x.getname();if(this.getscoreOfsum()x.getscoreOfsum()System.out.
15、println(this.getname()+“总分小于“+x.getname();else System.out.println(this.getname()+“总分等于“+x.getname();/equals 方法/比较 2 学生学号是否相等(还没完善)/* public boolean equals(Object x)if(this.getClass()!=x.getClass()return false;Student b=(Student)x;if(this.id=b.getid()return true;*/(2)声明 StudentXW(学习委员)类为 Student 类的子类
16、。在 StudentXW 类中增加责任属性,并重写 testScore 方法(评测成绩= 三门课平均分+3 )public class StudentXW extends StudentString responsibility;/构造方法public StudentXW()super();/responsibility=“ “;public StudentXW(String aid,String aname,float ascoreOfenglish,float ascoreOfmath,float ascoreOfcomputer,String aresponsibility)super(
17、aid,aname,ascoreOfenglish,ascoreOfmath,ascoreOfcomputer);responsibility=aresponsibility;/testScore 测评成绩 /平均分public float testScore()return(this.scoreOfsum/3+3);/toString 方法public String toString()return(“学号:“+this.id+“n 姓名:“+name+“n 英语:“+this.scoreOfenglish+“n 数学:“+this.scoreOfmath+“n 计算机:“+this.sco
18、reOfcomputer+“n 总分:“+this.scoreOfsum+“n 职位:“+this.responsibility);(3)声明 StudentBZ 类为 Student 类的子类在 StudentBZ 类中增加责任属性,并重写 testScore 方法(评测成绩=三门课平均分+5)public class StudentBZ extends StudentString responsibility;/构造方法public StudentBZ()super();/responsibility=“;public StudentBZ(String aid,String aname,f
19、loat ascoreOfenglish,float ascoreOfmath,float ascoreOfcomputer,String aresponsibility)super(aid,aname,ascoreOfenglish,ascoreOfmath,ascoreOfcomputer);responsibility=aresponsibility;/testScore 测评成绩 /平均分public float testScore()return(this.scoreOfsum/3+5);/toString 方法public String toString()return(“学号:“
20、+this.id+“n 姓名:“+name+“n 英语:“+this.scoreOfenglish+“n 数学:“+this.scoreOfmath+“n 计算机:“+this.scoreOfcomputer+“n 总分:“+this.scoreOfsum+“n 职位:“+this.responsibility);4)声明测试类,生成若干个 Student 类、StudentXW 类及 StudentBZ 类对象,并分别计算它们的评测成绩(建议采用: 写一个测试函数,该函数以父类 student 数组作为参数) 。import java.text.*;public class test4_10
21、public static void main(String args)Student su=new Student(“001“,“苏轼“,56.00f,87.00f,95.00f);Student du=new Student(“002“,“杜甫“,86.00f,75.00f,80.00f);Student bai=new Student(“003“,“白居易“,42.00f,77.00f,65.00f);Student liu=new Student(“004“,“柳宗元“,67.00f,67.00f,67.00f);StudentXW ou=new StudentXW(“005“,“欧阳
22、修“,89.00f,98.00f,90.00f,“数学代表“);StudentXW wang=new StudentXW(“006“,“王安石“,98.00f,87.00f,36.00f,“英语代表“);StudentBZ li=new StudentBZ(“007“,“李白“,89.00f,87.00f,87.00f,“班长“);System.out.print(li);System.out.println(“n 评测成绩: “+new DecimalFormat(“0.00“).format(li.testScore();System.out.println();System.out.pr
23、int(wang);System.out.println(“n 评测成绩: “+new DecimalFormat(“0.00“).format(wang.testScore();System.out.println();System.out.print(ou);System.out.println(“n 评测成绩: “+new DecimalFormat(“0.00“).format(ou.testScore();System.out.println();System.out.print(su);System.out.println(“n 评测成绩: “+new DecimalFormat(
24、“0.00“).format(su.testScore();System.out.println();System.out.print(du);System.out.println(“n 评测成绩: “+new DecimalFormat(“0.00“).format(du.testScore();System.out.println();System.out.print(bai);System.out.println(“n 评测成绩: “+new DecimalFormat(“0.00“).format(bai.testScore();System.out.println();System.out.print(liu);System.out.println(“n 评测成绩: “+new DecimalFormat(“0.00“).format(liu.testScore();运行 test4_10 的结果如下: