2014-04-16 47 views
1

我的Java書有以下做法問題:重寫私有方法

public class Person(){...} 

public class Teacher extends Person{...} 

而且它要求以下哪些是真實的陳述的:

1:教師繼承的Person的構造函數。

2:教師可以添加新的方法和私人實例變量。

3:教師可以覆蓋Person現有的私人方法。

這本書說2和3是真的。我說只有2是真的。

我讀過,子類確實繼承私有方法和成員字段,但他們不能直接訪問。所以我的問題是,如果不能直接訪問,那麼如何覆蓋現有的私有方法?爲什麼要重寫私有方法,如果它們可能因爲一個很好的原因而被私有化?

+0

這是什麼書? – Scott

+0

@斯科特巴隆的AP計算機科學第6版 –

+0

他們可能意味着保護?或者這只是一個錯誤。當你有很多信息時,一些錯誤必然會漏掉。 – immibis

回答

4

3:教師可以覆蓋Person的現有私人方法。

這是錯誤的。

超級類的私有方法/字段不可見/被繼承到子類。所以,你不能重寫它們。

用一個例子試試看

+0

嗯,我的AP的CS書是錯的? –

+2

非常非常。只要輸入這個例子,看看你試圖編譯時會發生什麼。 – csmckelvey

+0

@SimionMita看到我的文章我不認爲這本書是錯的,也許是錯誤的選擇只是 – mel3kings

1

方法繼承,只有當他們是publicprotected或沒有訪問修飾符。 private不能被繼承。我認爲這本書意味着Teacher可以通過創建一個類似的方法名稱來更改私有方法Person,因爲教師沒有看到該方法。這就是所謂的方法陰影。 這是要麼選擇錯誤的詞使用覆蓋而不是陰影,或者給出了錯誤的答案。

例子:

public class Person(){ 
    private void sayHello(){...}  
} 

public class Teacher extends Person{ 
    public void sayHello(){...} 
} 
+5

我不確定這是否真的算作重寫。會嗎? –

+2

這不稱爲覆蓋。 –

+1

nope這是方法陰影,無論是選擇錯誤的詞使用覆蓋而不是陰影,或者給出錯誤的答案。 – mel3kings

0

正如其他人所說,子類不能覆蓋繼承類的私有方法。這是受保護的關鍵字的目的。對於被認爲對其他對象是私有的函數和數據成員而言,它仍然可以被子類訪問。如果私有函數可以被子類訪問,那麼受保護的關鍵字就沒有用處。

1

JLS §8.2被聲明爲private類的

成員不是由類的子類繼承。