这是《Java2实用教程第五版》的试题答案,需要的同学评论关注加点赞

有问题可以在评论区提出

1.问答题
(1)子类可以有多个父类吗?

不可以。Java是单继承的,只能继承一个父类。

(2)java.lang包中的Object类是所有其他类的祖先吗?

(3)如果子类和父类不在同一个包中,子类是否继承父类的友好成员?

不继承。关于各个访问修饰符的访问权限可以看下表

(4)子类怎样隐藏继承的成员变量?

声明与父类同名的成员变量。

(5)子类重写方法的规则是怎样的?重写方法的目的是什么?

子类重写的方法的返回值类型,方法名,参数类型,顺序,个数都要与父类继承的方法相同,而且访问修饰符的限定范围大于等于父类方法。目的是可以父类的状态和行为改变为自身的状态和行为,实现多态。

(6)父类的final方法可以被子类重写吗?

不可以

(7)什么类中可以有abstract方法?

abstract类。abstract方法必须在abstract类中,而abstract类中可以没有abstract方法

(8)对象的上转型对象有怎样的特点?

上转型对象不能操作子类新增的成员变量,不能调用子类新增的方法。上转型对象可以访问子类继承或隐藏的成员变量,可以调用子类继承的方法或子类重写的实例方法。

(9)一个类的各个子类是怎样体现多态的?

通过重写方法。

(10)面向抽象编程的目的和核心是什么?

面向抽象编程目的是为了应对用户需求的变化,核心是让类中每种可能的变化对应地交给抽象类的一个子类去负责,从而让该类的设计者不去关心具体实现。

2.选择题
(1)下列哪个叙述是正确的?
A.子类继承父类的构造方法。
B.abstract类的子类必须是非abstract类。
C.子类继承的方法只能操作子类继承和隐藏的成员变量。
D.子类重写或新增的方法也能直接操作被子类隐藏的成员变量。

答案:C
子类是不继承父类的构造方法的,而是必须调用其父类的构造方法。
abstract类的子类可以是abstract类,如果是非abstract类,就必须重写父类中所有的abstract方法。
D中子类新增的方法是不能直接操作被子类隐藏的成员变量的。

(2)下列哪个叙述是正确的?
A.final类可以有子类。
B.abstract类中只可以有abstract方法。
C.abstract类中可以有非abstract方法,但该方法不可以用final修饰。
D.不可以同时用final和abstract修饰同一个方法。
E.允许使用static修饰abstract方法。

答案:D
用final修饰的类是不允许被继承的,A错误
abstract类中也可以有普通成员方法,B错误
abstract类中的非abstract方法是可以用final修饰的,而abstract方法是不可以被final修饰的,C错误
D同上,所以正确
不允许使用static修饰abstract方法,E错误。

(3)下列程序中注释的哪两个代码(A、B、C、D)是错误的?(无法通过编译)?

class Father{private int money=12;float height;int seeMoney(){return money;//A}
}
class Son extends Father{int height;int lookMoney(){int m = seeMoney(); //Breturn m;}
}
class E{public static void main(String args[]){Son erzi = new Son();erzi.money = 300;   //Cerzi.height = 1.78F;//D}
}

答案:CD
程序声明了Son的对象erzi,去调用money属性赋值,虽然Son继承了Father,但是money是Father的私有变量,是无法继承的,不能够赋值。而且在Son类中声明了一个与Father同名的属性height,此时子类就隐藏了继承的成员变量,调用的时候就是在调用子类自己的成员变量height,因为是int型,无法被赋值给float型,所以C和D是错误的。

(4)假设C是B的子类,B是A的子类,cat是C类的一个对象,bird是B类的一个对象,下列哪个叙述是错误的?
A. cat instanceof B 的值是true。
B. bird instanceof A的值是true。
C. cat instanceof A的值是true。
D. bird instanceof C的值是true。

答案:D
instanceof运算符判断左面的对象是否是右面的类或其子类所创建的。
cat是C类的对象,而C是B的子类,所以A正确
bird是B类的对象而B是A的子类,所以B正确
cat是C类的对象,而C是B的子类,B又是A的子类,所以C正确
bird是B类的对象,而B是C的父类,所以D错误

(5)下列程序中注释的哪个代码(A、B、C、D)是错误的(无法通过编译)?

class A{static int m;static void f(){m = 20;    //A}
}
class B extends A{void f(){    //Bm = 222;    //C}
}
class E{public static void main(String args[]){A.f();    //D}
}

答案:B
实例方法是不能重写静态方法的,所以静态方法重写必须是静态方法。

(6)下列程序中注释的哪个代码(A、B、C、D)是错误的?

abstract class Takecare{
protected void speakHello(){} //A
public abstract static void cry(); //B
static int f(){ return 0;} //C
abstract float g(); //D
}

答案:B
abstract方法不能用static和private修饰;对于类,不能同时用final和abstract修饰,因为final关键字使得类不可继承,而abstract修饰的类如果不可以继承将没有任何意义。

(7)下列程序中注释的哪个代码(A、B、C、D)是错误的(无法通过编译)?

abstract class A{
abstract float getFloat(); //A
void f() //B
{ }
}
public class B extends A{
private float m = 1.0f; //C
private float getFloat () //D
{
return m;
}
}

答案:D
方法重写要求重写的方法的访问权限大于等于被重写的方法,父类该方法权限为友好,子类中为私有,所以是错误的。

(8)将下列哪个代码(A、B、C、D)放入程序中标注的【代码】处将导致编译错误?
A. public float getNum(){return 4.0f;}
B. public void getNum(){}
C.public void getNum(double d){}
D.public double getNum(float d){return 4.0d;}

class A{public float getNum(){return 3.0f;}
}
public class B extends A{【代码】
}

答案:B
方法重写要求方法名,返回值类型,参数完全相同,所以A符合,B返回值类型不同,编译错误。而C和D不仅返回值类型不同,参数也不同,不属于方法重写,而是属于子类自己新增的方法。

(9)对于下列代码,下列哪个叙述是正确的?
A.程序提示编译错误(原因是A类没有不带参数的构造方法)。
B.编译无错误,【代码】输出结果是0。
C.编译无错误,【代码】输出结果是1。
D.编译无错误,【代码】输出结果是2。

class A{public int i = 0;A(int m){i=1;}
}
public class B extends A{B(int m){i=2;}public static void main(String args[]){B b = new B(100);System.out.println(b.i);//【代码】}
}

答案:A
父类的构造方法不允许被继承,不允许被重写,但在子类的构造过程中必须调用其父类的构造方法,如果子类的构造方法中没有显式的调用父类的构造方法(super关键字),则系统默认调用父类无参的构造方法。如果子类构造方法中既没有显式调用父类的构造方法,而父类又没有无参的构造方法,则编译出错。

3.阅读程序
(1)请说出E类中【代码1】和【代码2】的输出结果。

class A{double f(double x,double y){return x + y;}
}
class B extends A{double f(int x,int y){return x*y;}
}
public class E{
public static void main(String args[]){B b = new B();System.out.println(b.f(3,5));    //【代码1】System.out.println(b.f(3.0,5.0));    //【代码2】}
}

答案:【代码1】15.0 。【代码2】 8.0
B类继承了A类,但是B中的f方法并不是重写A类中的(参数类型不同),【代码1】调用f传两个int,实际调用的是B类自己的方法,返回值是double,所以输出15.0 。【代码2】调用f传两个double,调用的是继承自A类的方法,输出8.0 。

(2)请说出B类中【代码1】好【代码2】的输出结果。

class A{public int getNumber(int a){return a+1;}
}
class B extends A{public int getNumber(int a){return a+100;}public static void main(String args[]){A a = new A();System.out.println(a.getNumber(10));    //【代码1】a = new B();System.out.println(a.getNumber(10));    //【代码2】}
}

答案:【代码1】:11。 【代码2】:110 。
对象a是A类的对象,调用的是A类自己的方法,接着让a实例化B类,a称为上转型对象,此时调用的是子类重写父类的方法。

(3)请说出E类中【代码1】~【代码4】的输出结果。

class A{double f(double x,double y){return x+y;}static int g(int n){return n*n;}
}
class B extends A{double f(double x,double y){double m = super.f(x,y);return m+x*y;}static int g(int n ){int m = A.g(n);return m+n;}
}
public class E{public static void main(String args[]){B b = new B();System.out.println(b.f(10.0,8.0));    //【代码1】System.out.println(b.g(3));    //【代码2】A a = new B();System.out.println(a.f(10.0,8.0));    //【代码3】System.out.println(a.g(3));    //【代码4】}
}

答案:【代码1】:98.0 。 【代码2】:12 。【代码3】:98.0 。 【代码4】:9
代码1调用b对象的f方法,b对象是B类实例化的,调用的是B类自己的f方法,传入10.0和8.0后,用super关键字调用了父类的f方法,得到18.0赋值给m,最后返回18.0+10.0*8.0也就是98.0。
【代码2】调用B类中的静态方法g传入3,方法内又去调用父类中的g方法传入3,得到9赋值给m后,输出9+3也就是12。
【代码3】a对象是上转型对象,上转型对象可以调用重写父类的方法以及父类派生的方法,所以a调用的f方法是它重写的方法,那么具体过程就跟【代码1】相同,答案为98.0
【代码4】在于g方法是静态方法,静态方法是不允许被重写的,所以B类中的g方法相当于该类特有的方法,那么a调用的g方法实际上是父类的,输出结果为9 。

(4)请说出E类中【代码1】~【代码3】的输出结果。

class A{int m;int getM(){return m;}int seeM(){return m;}
}
class B extends A{int m;int getM(){return m+100;}
}
public class E{public static void main(String args[]){B b = new B();b.m = 20;System.out.println(b.getM());//【代码1】上转型对象访问的是 被隐藏的m。A a = b;a.m = -100;        //上转型对象访问的是被隐藏的mSystem.out.println(a.getM());//【代码2】上转型对象调用的一定是子类重写的getM()方法System.out.println(b.seeM());//【代码3】子类继承的seeM()方法操作的m是被子类隐藏的m}
}

答案:【代码1】:120 【代码2】:120 【代码3】-100
详情请看题目代码中的注释。

4.编程题(参考例子13)
设计一个动物声音“模拟器”,希望模拟器可以模拟许多动物的叫声,要求如下。

  • 编写抽象类Animal

Animal抽象类有两个抽象方法cry()和getAnimalName(),即要求各种具体的动物给出自己的叫声和种类名称。

  • 编写模拟器类Simulator

该类有一个playSound(Animal animal)方法,该方法的参数是Animal类型,即参数animal可以调用Animal的子类重写的cry()方法播放具体动物的声音,调用子类重写的getAnimalName()方法显示动物种类的名称。

  • 编写Animal的子类:Dog和Cat类

下图是Simulator、Animal、Dog、Cat的UML图

编写主类Application(用户程序)
在主类Application的main方法中至少包含如下代码:

Simulator simulator = new Simulator();
simulator.playSound(new Dog());
simulator.playSound(new Cat());
Animal.java
public abstract class Animal{public abstract void cry();public abstract String getAnimalName();
}Simulator.java
public class Simulator{public void playSound(Animal animal){System.out.println("现在播放"+animal.getAnimalName()+"类的声音:");animal.cry();}
}Dog.java
public class Dog extends Animal{public void cry(){System.out.println("汪汪...汪汪");}public String getAnimalName(){return "狗";}
}Cat.java
public class Cat extends Animal{public void cry(){System.out.println("喵喵...喵喵");}public String getAnimalName(){return "猫";}
}Application.java
public class Test{public static void main(String args[]){Simulator simulator = new Simulator();simulator.playSound(new Dog());simulator.playSound(new Cat());}
}

Java2实用教程第五版+第五章习题答案相关推荐

  1. Java2实用教程第五版+第四章习题答案

    这是<Java2实用教程第五版>的试题答案,需要的同学评论关注加点赞 有问题可以在评论区提出 1.问答题 (1)面向对象语言有哪三个特性? 封装.继承和多态 (2)类名应当遵守怎样的编程风 ...

  2. Java2实用教程第五版+第六章习题答案

    这是<Java2实用教程第五版>的试题答案,需要的同学评论关注加点赞 有问题可以在评论区提出 1.问答题 (1)接口中能声明变量吗? 不能 (2)接口中能定义非抽象方法吗? 不能 可以把实 ...

  3. C++Primer第五版 第十一章习题答案(31~38)

    31:知识点:在multimap中,具有相同关键字的元素会相邻存储 #include<iostream> #include<string> #include<fstrea ...

  4. 数值分析李庆杨第五版第七章习题

    数值分析李庆杨第五版第七章习题 7 用牛顿法 用xuan截法 用抛物线法 11 普通牛顿法 加m牛顿法 求重根迭代法法 7 用牛顿法 // An highlighted blocksyms xf(x) ...

  5. python核心教程第二版答案_python核心编程第二版第4章习题答案.docx

    python核心编程第二版第4章习题答案.docx 4-1.Python 对象.与所有 Python 对象有关的三个属性是什么?请简单的描述一下. 答案: 所有的 Python 对象都拥有三个特性:身 ...

  6. java2实用教程第5版第九章_java2实用教程(例子代码)第4版第九章.doc

    java2实用教程(例子代码)第4版第九章 java2实用教程(例子代码)第4版第九章 例9_3 Lt4_3.java public clss Lt4_3 { public static void m ...

  7. php实用教程第3版郑阿奇课后答案_PHP实用教程(第3版)

    基本信息 书名:PHP实用教程(第3版) 定价:62.00元 作者:郑阿奇 出版社:电子工业出版社 出版日期:2019-01-01 9787#121348822 字数: 页码: 版次: 装帧:平装-胶 ...

  8. 【c++primer第五版】第十章习题答案

    第十章 泛型算法 练习10.1 头文件algorithm中定义了一个名为count的函数,它类似find, 接受一对迭代器和一个值作为参数.count返回给定值在序列中出现的次数.编写程序,读取int ...

  9. Java2实用教程(第二版)程序代码——第十四章 Component类的常用方法

      1//例子1   2import java.applet.*;import java.awt.*;   3import java.awt.event.*;   4import javax.swin ...

  10. linux教程第五版第三章课后答案,linux 第三章 章习题.doc

    填空题 Linux_____可以理解为运行在_____之上,回避直接操作_____和配置文件的应用程序. 在Linux中常见的两种图形环境是_____和______. 在Linux中的配置文件为___ ...

最新文章

  1. 【笨木头Lua专栏】基础补充08:协同程序之resume-yield间的数据返回
  2. GIT和SVN之间的五个基本区别
  3. html数据分析表格api_Python数据分析基本库——Matplotlib(一)
  4. jsoup抓取网页报错UnsupportedMimeTypeException
  5. Oracle索引----位图索引
  6. java与python难度对比_Python和Java的区别,看完这篇文章你就清楚啦
  7. 10款 非常酷炫的网站首页焦点图 兼容ie浏览器
  8. springMVC视图解析器的配置和使用
  9. Word怎么转换成PDF?
  10. [状压dp][剪枝搜索] 洛谷 P2831 愤怒的小鸟
  11. 第二次作业+105032014049
  12. controller层没反应_打过蜡的石材再做结晶没效果怎么办?
  13. 计算机填充表格,表格自动填充 这几种你也会?
  14. PS2023和2022版本保姆级安装教程【博主亲测】
  15. 《深入理解计算机系统》课本第七章自学笔记——20135203齐岳
  16. 树莓派程序开机自启(尝试过很多终于成了)
  17. 编译原理:LL(1)语法分析器的实现(内含代码详细注释)
  18. 50个js小项目-DAY1-expanding cards
  19. GitModel|Task04|随机模拟
  20. somachine V4.1如何注册

热门文章

  1. Keil.STM32F1xx_DFP.2.4.0.pack
  2. liunx服务器项目迁移,linux服务器数据迁移
  3. 蓝桥杯客观题知识点汇总(自我总结)以及主观题Debug痛点
  4. 渐行渐远的老朋友们,谢谢你们曾经陪我走过
  5. 掌上实验室V8系列教程(八)ADC模数转换
  6. 图像处理项目——基于机器视觉技术的人脸在线识别系统设计
  7. 2013一些好的句子
  8. REC论文阅读(一):MAttNet
  9. 如何使用webshell方式登录腾讯云Linux轻量应用服务器实例?
  10. 阿里巴巴联合欧莱雅发布移动端 AI 痘痘检测应用