国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

抽象類可以繼承實體類嗎?

2019-11-08 03:15:07
字體:
來源:轉載
供稿:網友

一道java 常見面試題,網上找到的幾乎每個 java 面試筆試題大全或集錦里都能找到這道題。

題目如下:

問: 抽象類是否可繼承實體類 (concrete class)

答: 抽象類是可以繼承實體類,但前提是實體類必須有明確的構造函數

答案很明確,可以繼承。其實從Object就是個實體類,java的API文檔里,每個抽象類的條目里都明確寫著直接或間接繼承自Object,所以這點是沒有疑問的。

關鍵在于這答案里所說的“前提是實體類必須有明確的構造函數”一句,是什么意思。

一般學習者會寫的簡單試驗代碼:

class A{}

abstract class B extends A{}

結果完全正常,編譯通過。似乎和“實體類必須有明確的構造函數”完全沒有關系。

這個問題涉及到兩個個基礎知識:

1.

所有的class都必須有一個構造方法,如果你沒有在代碼里聲明構造方法,系統會自動給你生成一個公有無參的構造方法。而只要你自己聲明了一個構造方法,無論有參無參,私有公有,系統就不再幫你生成默認無參構造器了。

2.

所有的子類構造器都要求在第一行代碼中調用父類構造器,如果不寫,系統默認去調用父類的無參構造器。

所以,如果把系統默認配給的方法也算進去,class A{}的代碼實際上是

class A{

public A(){}

}

B繼承 A 的時候,則是

abstract class B extends A{

public B(){

super();

}

}

要試驗出這繼承規則的內部情況,也很簡單,在最上面那個簡單試驗代碼里,加上個私有構造器,有參無參都行。

class A{

PRivate A(){}

}

這個時候,如基礎知識(1) 中所說,系統不再給你默認無參構造器, B的構造器根據(2)中的規則去調用super(),卻找不到A的無參構造器,所以導致abstract class B extends A{} 編譯不能通過。(因為A中沒有任何構造器可供子類調用,其實這個時候A只能夠供內部類繼承,我用的Eclipse的3.4版本會建議給B改名,但是這解決不了這個問題。)

現在,你應該了解了資料給的那句語焉不詳的“實體類必須有明確的構造函數”的含義:

1.沒寫構造器的,那是擁有默認無參公有構造函數的,子類可以什么都不寫,讓默認構造器去調用它。這是最初那兩行代碼的情況。

2.寫了子類可訪問的無參構造器的,也是一樣,子類里可以什么都不寫,用默認機制調用。

3.寫了 有參構造器卻沒寫無參構造器的,父類里沒有子類可訪問的無參構造器,子類必須在子類構造器里的第一句寫明,調用父類有參構造器,并把參數傳進去。

4.聲明為final的以及所有構造器都不在子類訪問權限之內的類無法繼承

其實只要是在類的繼承中,無論抽象還是實體,都需要符合這個規則的。在這個繼承試驗中隨時刪掉或是加上abstract的前綴,結果都沒有變化。個人覺得“實體類必須有明確的構造函數”一句實在是無法把這個情況表達清楚,所以廣大求職者還是寫得清楚些好。

我喜歡的寫法是“可以繼承,但是和實體類的繼承一樣,也要求父類可繼承,并且擁有子類可訪問到的構造器。”

我筆試的時候只答的“可以繼承”。心想所有的類都從Object類繼承吧,掉了后半句。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 堆龙德庆县| 乳山市| 库车县| 黔江区| 大石桥市| 东丽区| 左权县| 西安市| 习水县| 斗六市| 台北市| 天门市| 康平县| 信丰县| 万载县| 新龙县| 额尔古纳市| 绥滨县| 邳州市| 沾化县| 东至县| 潼南县| 醴陵市| 南康市| 从化市| 济阳县| 云和县| 武安市| 金山区| 阿坝县| 四子王旗| 广元市| 锡林浩特市| 浦东新区| 伊吾县| 西峡县| 赣榆县| 鄂托克前旗| 湖南省| 濮阳市| 南通市|