解析java程序设计第四章课后答案.docx
《解析java程序设计第四章课后答案.docx》由会员分享,可在线阅读,更多相关《解析java程序设计第四章课后答案.docx(14页珍藏版)》请在冰豆网上搜索。
解析java程序设计第四章课后答案
第4章习题解答
1.类的继承的主要好处是什么?
Java中支持类的多继承形式吗?
继承是一种由已有的类创建新类的机制。
利用继承,我们可以先创建一个拥有共有属性的一般类,根据该一般类再创建具有特殊属性的新类,新类自动拥有一般类的属性和行为,并根据需要可以增加新的属性和行为,或者改变父类的行为。
类的继承的主要好处是代码复用。
Java不支持类的多继承形式。
2.解释一下方法重载和方法覆盖的概念,并对两者加以对比。
如果子类中定义方法所用的名称、返回类型和参数表和父类中方法所使用的完全一样,但具体实现不同,则称子类方法覆盖了父类中的方法。
在同一类中,如果方法名称相同,但参数表不同,则称为方法重载。
3.编写一个学生和教师的数据输入和显示程序。
学生数据有编号、姓名、班号和成绩,教师数据有编号、姓名、职称和部门。
要求将编号、姓名输入和显示设计成一个类Person,并作为学生类Student和教师类Teacher的父类。
importjava.util.*;
classPerson
{
privateStringname;
privateintid;
publicvoidinput(){
Scannersc=newScanner(System.in);
name=sc.nextLine();
id=sc.nextInt();
}
publicvoiddisplay(){
System.out.println("
}
}
classStudentextendsPerson
{
privateintclassNo;
privateintscore;
publicvoidinput(){
super.input();
Scannersc=newScanner(System.in);
classNo=sc.nextInt();
score=sc.nextInt();
}
publicvoiddisplay(){
super.display();
System.out.println("classNo="+classNo+"score="+score);
}
publicstaticvoidmain(String[]args)
{
Students=newStudent();
s.input();
s.display();
}
}
4.创建Animal(动物):
Mouse,Dog等的一个继承分级结构。
在父类中,提供适用于所有Animal的方法,并在子类中覆盖它们,从而根据不同类型的Animal采取不同的行动。
abstractclassAnimal
{
publicabstractvoidspeak();
}
classMouseextendsAnimal
{
publicvoidspeak()
{
System.out.println("miao.....");
}
}
classDogextendsAnimal
{
publicvoidspeak()
{
System.out.println("wang.....");
}
}
publicclassExample
{
publicstaticvoidmain(Stringargs[])
{
Mousem=newMouse();
m.speak();
Dogd=newDog();
d.speak();
}
}
5.解释super关键字的不同用法。
调用超类的构造方法。
引用超类的成员变量及方法。
6.阅读以下程序,给出运行结果。
classSuperClass{
intx;
SuperClass(){
x=3;
System.out.println("inSuperClass:
x="+x);
}
voiddoSomething(){
System.out.println("inSuperClass.doSomething()");
}
}
classSubClassextendsSuperClass{
intx;
SubClass(){
super();
x=5;
System.out.println("inSubClass:
x="+x);
}
voiddoSomething(){
super.doSomething();
System.out.println("inSubClass.doSomething()");
System.out.println("super.x="+super.x+"sub.x="+x);
}
}
publicclassInheritance{
publicstaticvoidmain(Stringargs[]){
SubClasssubC=newSubClass();
subC.doSomething();
}
}
运行结果:
inSuperClass:
x=3
inSubClass:
x=5
inSuperClass.doSomething()
inSubClass.doSomething()
super.x=3sub.x=5
7.介绍抽象类和抽象方法的概念,一个抽象类的所有方法是否都必须为抽象方法?
有时在类库开发中,要创建一个体现某些基本行为的类,并为该类声明方法,但无法在该类中实现全部具体行为,取而代之,在子类中具体实现该方法。
面向对象程序设计中,利用抽象类(abstractclass),可以声明仅定义了部分实现的类,让该类的子类提供某些或全部方法的具体实现。
抽象类通常代表一个抽象概念,它提供一个继承的出发点。
一个抽象类的所有方法并非都必须为抽象方法。
8.通过查看JavaAPI文档,在Java类库中寻找abstract类和abstract方法的一些例子。
例如:
java.io包中,Writer类即为一个抽象类。
9.定义一个Shape抽象类,在此基础上派生出Rectangle和Circle类,二者都有GetArea()方法计算对象的面积,GetPerim()方法计算对象的周长。
使用Rectangle类派生一个新类Square,并编写测试程序加以测试。
abstractclassShape{
abstractdoubleGetArea();
abstractdoubleGetPerim();
}
classRectangleextendsShape
{
doublew,h;
Rectangle(doublew,doubleh){
this.w=w;
this.h=h;
}
doubleGetArea(){
returnw*h;
}
doubleGetPerim(){
return2*(w+h);
}
}
classCircleextendsShape
{
doubler;
Circle(doubler){
this.r=r;
}
doubleGetArea(){
return2*3.1415*r*r;
}
doubleGetPerim(){
return2*3.1415*r;
}
}
classTest
{
publicstaticvoidmain(String[]args)
{
Circlec=newCircle(3.5);
Rectangler=newRectangle(2.5,6);
System.out.println("圆形的周长="+c.GetPerim()+"面积="+c.GetArea());
}
}
10.在Java类库中寻找final类和final方法的一些例子。
java.lang.String类即为final类。
11.解释接口的概念,Java中接口可以有多继承形式吗?
Java中,一个接口(interface)仅仅描述方法的特征,而不给出方法的具体实现;而类不仅给出方法的特征,还给出方法的具体实现。
因此,接口把方法的特征和实现分离开,可以将接口看作是代表某一个角色,而实现这个接口的类便是扮演这个角色的演员,一个角色可以由不同的演员来演,而不同的演员之间除了扮演一个共同的角色外,并不要求有任何其它的共同之处。
Java中接口可以有多继承形式。
12.阅读以下程序,给出运行结果。
interfaceShowMessage
{
voidshowTradeMark();
}
classTVimplementsShowMessage
{
publicvoidshowTradeMark()
{
System.out.println("我是电视机");
}
}
classPCimplementsShowMessage
{
publicvoidshowTradeMark()
{
System.out.println("我是电脑");
}
}
publicclassExample
{
publicstaticvoidmain(Stringargs[])
{
ShowMessagesm;
sm=newTV();
sm.showTradeMark();
sm=newPC();
sm.showTradeMark();
}
}
运行结果如下:
我是电视机
我是电脑
13.编写一个实现Comparable接口类型的类BankAccount。
根据递增的存款额排列银行中的账号,并提供一个测试程序,对银行账号数组列表进行排序。
//BankAccount.java
packageexercise4_13;
classBankAccountimplementsComparable{
privateStringbankId;
privatefloatdeposit;
BankAccount(StringId,floatdeposit){
bankId=Id;
this.deposit=deposit;
}
publicStringtoString(){
return"账号:
"+bankId+"\t存款:
"+deposit;
}
publicintcompareTo(BankAccountother){
if(depositif(deposit>other.deposit)return1;
return0;
}
}
//Test.java
packageexercise4_13;
importjava.util.Arrays;
publicclassTest{
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
BankAccount[]b=newBankAccount[3];
b[0]=newBankAccount("001",30);
b[1]=newBankAccount("002",50);
b[2]=newBankAccount("003",40);
Arrays.sort(b);
for(inti=0;iSystem.out.println(b[i].toString());
System.exit(0);
}
}
14.为某单位编写一个程序,用来计算每一种交通工具运行1000公里所需的时间。
现有两种工具:
Car007和Plane,需要编写三个类:
ComputeTime.java,Plane.java,Car007.java和接口Vehicle.java,要求在未来如果增加第3种交通工具的时候,不必修改以前的任何程序,只需要编写新的交通工具的程序。
各种交通工具对象的速度由各个交通工具类中相应的返回运行速度的方法来获取。
//Vehicle.java
packageexercise4_14;
interfaceVehicle{
intgetVelocity();
}
//Plane.java
packageexercise4_14;
classPlaneextendsComputeTimeimplementsVehicle{
privateintvelocity;
Plane(intvelocity){
this.velocity=velocity;
}
publicintgetVelocity(){
returnvelocity;
}
floatTime(){
return((float)super.getDistance())/velocity;
}
}
//ComputeTime.java
packageexercise4_14;
abstractclassComputeTime{
privateintdistance=1000;
intgetDistance(){
returndistance;
}
abstractfloatTime();
}
//Car007.java
packageexercise4_14;
classCar007extendsComputeTimeimplementsVehicle{
privateintvelocity;
Car007(intvelocity){
this.velocity=velocity;
}
publicintgetVelocity(){
returnvelocity;
}
floatTime(){
return((float)super.getDistance())/velocity;
}
}
//Test.java
packageexercise4_14;
publicclassTest{
publicstaticvoidmain(String[]args){
Planep=newPlane(20);
Car007c=newCar007(50);
System.out.println("速度为"+p.getVelocity()+"公里每小时的飞机运行1000公里需"+p.Time()+"小时");
System.out.println("速度为"+c.getVelocity()+"公里每小时的汽车运行1000公里需"+c.Time()+"小时");
System.exit(0);
}
}
15.编写一个程序实现小型公司的工资管理。
该公司主要有4类人员:
经理、兼职技术人员、销售员和销售经理。
要求存储这些人员的编号、姓名和月工资,计算月工资并显示全部信息。
月工资计算办法是:
经理拿固定月薪7000元;兼职技术人员按每小时80元领取月薪;销售员按该当月销售额的3%提成;销售经理既拿固定月工资也领取销售提成,固定月工资为4000元,销售提成为所管辖部门当月销售总额的5%。
提示:
利用java的接口功能来模拟多继承。