第五、六章课后习题

第五章课后习题

一、问答题
1.子类可以有多个父类吗?
答案:不可以
2.java.lang包中的Object类是所有其他类的祖先类吗?
答案:是
3.如果子类和父类不在同一个包中,子类是否继承父类的友好成员? 答案:不继承
4.子类怎样隐藏继承的成员变量?
答案: 声明与父类同名的成员变量
5.子类重写方法的规则是怎样的?重写方法的目的是什么?
答案:子类重写的方法类型和父类的方法的类型一致或者是父类的方法的类型的子类型,重写的方法的名字、参数个数、参数的类型和父类的方法完全相同。重写方法的目的是隐藏继承的方法。
6.父类的final方法可以被子类重写吗?
答案:不可以
7.什么类中可以有abstract方法?
答案:abstract类
8.对象的上转型对象有怎样的特点?
答案:上转型对象不能操作子类新增的成员变量;不能使用子类新增的方法。上转型对象可以操作子类继承或者隐藏的成员变量,也可以使用子类继承的或者重写的方法。上转型对象操作子类继承或重写的方法,其作用等价于子类对象去调用这些方法。因此,如果子类重写了父类的某个方法,则当对象的上转型对象调用这个方法时一定是调用了这个重写的方法。
9.一个类的各个子类是怎样体现多态的?
答案:通过重写
10.面向抽象编程的目的和核心是什么?
答案:目的是为了应对用户需求的变化,核心是让类中每种可能的变化对应地交给抽象类的一个子类类去负责,从而让该类的设计者不去关心具体实现。
二、选择题
1.下列哪个叙述是正确的?

A. 子类继承父类的构造方法。

B. abstract类的子类必须是非abstract类。

C. 子类继承的方法只能操作子类继承和隐藏的成员变量。

D. 子类重写或新增的方法也能直接操作被子类隐藏的成员变量。
答案:C
2.下列哪个叙述是正确的?

A. final 类可以有子类。

B. abstract类中只可以有abstract方法。

C. abstract类中可以有非abstract方法,但该方法不可以用final修饰。

D. 不可以同时用final和abstract修饰同一个方法。

E. 允许使用static修饰abstract方法。
答案:D
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(); //B
return m;
}
}
class E {
public static void main(String args[]) {
Son erzi = new Son();
erzi.money = 300; //C
erzi.height = 1.78F; //D
}
}
答案:CD
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
5.下列程序中注释的哪个代码(A,B,C,D)是错误的(无法通过编译)?
class A {
static int m;
static void f(){
m = 20 ; //A
}
}
class B extends A {
void f() //B
{ m = 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
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
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
三、阅读程序
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 xy;
}
}
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
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、11
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
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】
A a = b;
a.m = -100; // 上转型对象访问的是被隐藏的m
System.out.println(a.getM()); //【代码2】上转型对象调用的一定是子类重写的getM()方法
System.out.println(b.seeM()); //【代码3】子类继承的seeM()方法操作的m是被子类隐藏的m
}
}
答案:1、120 2、120 3、-100
四、编程题(参考例子13)
设计一个动物声音“模拟器”,希望模拟器可以模拟许多动物的叫声。要求如下:
 编写抽象类Animal
Animal抽象类有2个抽象方法cry()和getAnimaName(),即要求各种具体的动物给出自己的叫声和种类名称。
 编写模拟器类Simulator
该类有一个playSound(Animal animal)方法,该方法的参数是Animal类型。即参数animal可以调用Animal的子类重写的cry()方法播放具体动物的声音、调用子类重写的getAnimalName()方法显示动物种类的名称。
 编写Animal类的子类:Dog,Cat类
编写主类Application(用户程序)
在主类Application的main方法中至少包含如下代码:
Simulator simulator = new Simulator();
simulator.playSound(new Dog());
simulator.playSound(new Cat());

第六章课后习题

一、问答题
1.接口中能声明变量吗?
答案:不能
2.接口中能定义非抽象方法吗?
答案:不能
3.什么叫接口的回调?
答案:接口回调是指:可以把实现某一接口的类创建的对象的引用赋给该接口声明的接口变量中,那么该接口变量就可以调用被类重写的接口方法。实际上,当接口变量调用被类重写的接口方法时,就是通知相应的对象调用这个方法。
4.接口中的常量可以不指定初值吗?
答案:不可以
5.可以在接口中只声明常量,不声明抽象方法吗?
答案:可以
二、选择题
1.下列哪个叙述是正确的
A.一个类最多可以实现两个接口。
B.如果一个抽象类实现某个接口,那么它必须要重写接口中的全部方法。
C.如果一个非抽象类实现某个接口,那么它可以只重写接口中的部分方法。
D.允许接口中只有一个抽象方法。
答案:A
2.下列接口中标注的(A,B,C,D)中,哪两个是错误的?
interface Takecare {
protected void speakHello(); //A
public abstract static void cry(); //B
int f(); //C
abstract float g(); //D
}
答案:AB
3.将下列(A,B,C,D)哪个代码替换下列程序中的【代码】不会导致编译错误。
A.public int f(){return 100+M;}
B.int f(){return 100;}
C.public double f(){return 2.6;}。
D.public abstract int f();
interface Com {
int M = 200;
int f();
}
class ImpCom implements Com {
【代码】
}
答案:B

三、阅读程序
1.请说出E类中【代码1】,【代码2】的输出结果。
interface A {
double f(double x,double y);
}
class B implements A {
public double f(double x,double y) {
return x*y;
}
int g(int a,int b) {
return a+b;
}
}
public class E {
public static void main(String args[]) {
A a = new B();
System.out.println(a.f(3,5)); //【代码1】
B b = (B)a;
System.out.println(b.g(3,5)); //【代码2】
}
}
答案:1、15.0 2、8
2.请说出E类中【代码1】,【代码2】的输出结果。
interface Com {
int add(int a,int b);
}
abstract class A {
abstract int add(int a,int b);
}
class B extends A implements Com{
public int add(int a,int b) {
return a+b;
}
}
public class E {
public static void main(String args[]) {
B b = new B();
Com com = b;
System.out.println(com.add(12,6)); //【代码1】
A a = b;
System.out.println(a.add(10,5)); //【代码2】
}
}
答案:1、18 2、15
四、编程题(参考例子6)
该题目和第5章习题5的编程题类似,只不过这里要求使用接口而已。
设计一个动物声音“模拟器”,希望模拟器可以模拟许多动物的叫声。要求如下:
 编写接口Animal
Animal接口有2个抽象方法cry()和getAnimaName(),即要求实现该接口的各种具体动物类给出自己的叫声和种类名称。
 编写模拟器类Simulator
该类有一个playSound(Animal animal)方法,该方法的参数是Animal类型。即参数animal可以调用实现Animal接口类重写的cry()方法播放具体动物的声音、调用重写的getAnimalName()方法显示动物种类的名称。
 编写实现Animal接口的Dog类和Cat类
图6.14是Simulator、Animal、Dog、Cat的UML图。
 编写主类Application(用户程序)
在主类Application的main方法中至少包含如下代码:
Simulator simulator = new Simulator();
simulator.playSound(new Dog());
simulator.playSound(new Cat());

猜你喜欢

转载自www.cnblogs.com/2332175994-1314/p/9135920.html