Java 习题6 参考答案及解析_Java 習題5 參考答案及解析(1)

1.問答題

(1)子類可以有多個父類嗎?

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

(3)如果子類和父類不在同一個包中,子類是否繼承父類的友好成員?

(4)子類怎樣隱藏繼承的成員變量?

(5)子類重寫方法的規則是怎樣的?重寫方法的目的是什么?

(6)父類的final方法可以被子類重寫嗎?

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

(8)對象的上轉型對象有怎樣的特點?

(9)一個類的各個子類是怎樣體現多態的?

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

問答題解析

1.不可以。Java是單繼承的,只能繼承一個父類。

2.是。

3.不繼承。關於各個訪問修飾符的訪問權限可以看下表

訪問修飾符

本類

同包

子類

其他

private

T

友好

T

T

protected

T

T

T

public

T

T

T

T

4.聲明與父類同名的成員變量。

5.子類重寫的方法的返回值類型,方法名,參數類型,順序,個數都要與父類繼承的方法相同,而且訪問修飾符的限定范圍大於等於父類方法。目的是可以父類的狀態和行為改變為自身的狀態和行為,實現多態。

6.不可以

7.abstract類。abstract方法必須在abstract類中,而abstract類中可以沒有abstract方法

8.上轉型對象不能操作子類新增的成員變量,不能調用子類新增的方法。上轉型對象可以訪問子類繼承或隱藏的成員變量,可以調用子類繼承的方法或子類重寫的實例方法。

9.通過重寫方法。

10.面向抽象編程目的是為了應對用戶需求的變化,核心是讓類中每種可能的變化對應地交給抽象類的一個子類去負責,從而讓該類的設計者不去關心具體實現。

2.選擇題

(1)下列哪個敘述是正確的?

A.子類繼承父類的構造方法。

B.abstract類的子類必須是非abstract類。

C.子類繼承的方法只能操作子類繼承和隱藏的成員變量。

D.子類重寫或新增的方法也能直接操作被子類隱藏的成員變量。

(2)下列哪個敘述是正確的?

A.final類可以有子類。

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

C.abstract類中可以有非abstract方法,但該方法不可以用final修飾。

D.不可以同時用final和abstract修飾同一個方法。

E.允許使用static修飾abstract方法。

(3)下列程序中注釋的哪兩個代碼(A、B、C、D)是錯誤的?(無法通過編譯)?

Java

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

}

}

(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。

(5)下列程序中注釋的哪個代碼(A、B、C、D)是錯誤的(無法通過編譯)?

Java

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

}

}

(6)下列程序中注釋的哪個代碼(A、B、C、D)是錯誤的?

Java

abstract class Takecare{

protected void speakHello(){} //A

public abstract static void cry(); //B

static int f(){ return 0;} //C

abstract float g(); //D

}

(7)下列程序中注釋的哪個代碼(A、B、C、D)是錯誤的(無法通過編譯)?

Java

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;

}

}

(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{

【代碼】

}

(9)對於下列代碼,下列哪個敘述是正確的?

A.程序提示編譯錯誤(原因是A類沒有不帶參數的構造方法)。

B.編譯無錯誤,【代碼】輸出結果是0。

C.編譯無錯誤,【代碼】輸出結果是1。

D.編譯無錯誤,【代碼】輸出結果是2。

Java

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);//【代碼】

}

}

選擇題解析

9.A

子類的構造過程中必須調用其父類的構造方法,如果子類的構造方法中沒有顯示調用父類的構造方法,則系統默認調用父類無參的構造方法。如果子類構造方法中既沒有顯示調用父類的構造方法,而父類又沒有無參的構造方法,則編譯出錯。

8.B

方法重寫要求方法名,返回值類型,參數完全相同,所以A符合,B返回值類型不同,編譯錯誤。而C和D不僅返回值類型不同,參數也不同,不屬於方法重寫,而是屬於子類自己新增的方法。

7.D

方法重寫要求重寫的方法的訪問權限大於等於被重寫的方法,父類該方法權限為友好,子類中為私有,所以是錯誤的。

6.B

abstract方法不能用static和private修飾;對於類,不能同時用final和abstract修飾,因為final關鍵字使得類不可繼承,而abstract修飾的類如果不可以繼承將沒有任何意義。

5.B

實例方法是不能重寫靜態方法的,所以靜態方法重寫必須是靜態方法。

4.D

instanceof運算符判斷左面的對象是否是右面的類或其子類所創建的。

cat是C類的對象,而C是B的子類,所以A正確

bird是B類的對象而B是A的子類,所以B正確

cat是C類的對象,而C是B的子類,B又是A的子類,所以C正確

bird是B類的對象,而B是C的父類,所以D錯誤

3.CD

程序聲明了Son的對象erzi,去調用money屬性賦值,雖然Son繼承了Father,但是money是Father的私有變量,是無法繼承的,不能夠賦值。而且在Son類中聲明了一個與Father同名的屬性height,此時子類就隱藏了繼承的成員變量,調用的時候就是在調用子類自己的成員變量height,因為是int型,無法被賦值給float型,所以C和D是錯誤的。

2.D

用final修飾的類是不允許被繼承的,A錯誤

abstract類中也可以有普通成員方法,B錯誤

abstract類中的非abstract方法是可以用final修飾的,而abstract方法是不可以被final修飾的,C錯誤

D同上,所以正確

不允許使用static修飾abstract方法,E錯誤。

1.C

子類是不繼承父類的構造方法的,而是必須調用其父類的構造方法。

abstract類的子類可以是abstract類,如果是非abstract類,就必須重寫父類中所有的abstract方法。

D中子類新增的方法是不能直接操作被子類隱藏的成員變量的。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值