第五、六章課后習題


第五章課后習題

一、問答題
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());


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM