抽象類別是否可繼承實體類

來源:互聯網
上載者:User
  1.  關於“抽象類別是否可繼承實體類”的辨析。     
  2. 一道java 常見面試題,網上找到的幾乎每個 java 面試筆試題大全或集錦裡都能找到這道題。    
  3. 題目如下:    
  4. 問:  抽象類別是否可繼承實體類 (concrete class)  
  5.   
  6. 答: 抽象類別是可以繼承實體類,但前提是實體類必須有明確的建構函式                 
  7. 答案很明確,可以繼承。其實從Object就是個實體類,java的API文檔裡,每個抽象類別的條目裡都明確寫著直接或間接繼承自Object,所以這點是沒有疑問的。  
  8.      
  9. 關鍵在於這答案裡所說的“前提是實體類必須有明確的建構函式”一句,是什麼意思。        
  10. 一般學習者會寫的簡單實驗代碼:     
  11. class A{}     
  12. abstract class B extends A{}      
  13. 結果完全正常,編譯通過。似乎和“實體類必須有明確的建構函式”完全沒有關係。        
  14. 這個問題涉及到兩個個基礎知識:     
  15. 1.      
  16. 所有的class都必須有一個構造方法,如果你沒有在代碼裡聲明構造方法,系統會自動給你產生一個公有無參的構造方法。而只要你自己聲明了一個構造方法,無論有參無參,私人公有,系統就不再幫你產生預設無參構造器了。     
  17. 2.    
  18. 所有的子類構造器都要求在第一行代碼中調用父類構造器,如果不寫,系統預設去調用父類的無參構造器。              
  19. 所以,如果把系統預設配給的方法也算進去,class A{}的代碼實際上是     
  20. class A{     
  21.   public A(){}     
  22. }             
  23. B繼承 A 的時候,則是     
  24. abstract class B extends A{     
  25.   public B(){     
  26.     super();     
  27.   }     
  28. }         
  29. 要實驗出這繼承規則的內部情況,也很簡單,在最上面那個簡單實驗代碼裡,加上個私人構造器,有參無參都行。     
  30. class A{     
  31.   private A(){}     
  32. }  
  33.   
  34. 這個時候,如基礎知識(1) 中所說,系統不再給你預設無參構造器, B的構造器根據(2)中的規則去調用 super(),卻找不到A的無參構造器,所以導致abstract class B extends A{} 編譯不能通過。(因為A中沒有任何構造器可供子類調用,其實這個時候A只能夠供內部類繼承,我用的Eclipse的3.4版本會建議給B改名,但是這解決不了這個問題。)  
  35.      
  36. 現在,你應該瞭解了資料給的那句語焉不詳的“實體類必須有明確的建構函式”的含義:     
  37. 1.沒寫構造器的,那是擁有預設無參公有建構函式的,子類可以什麼都不寫,讓預設構造器去調用它。這是最初那兩行代碼的情況。     
  38. 2.寫了子類可訪問的無參構造器的,也是一樣,子類裡可以什麼都不寫,用預設機制調用。     
  39. 3.寫了 有參構造器卻沒寫無參構造器的,父類裡沒有子類可訪問的無參構造器,子類必須在子類構造器裡的第一句寫明,調用父類有參構造器,並把參數傳進去。     
  40. 4.聲明為final的以及所有構造器都不在子類存取權限之內的類無法繼承            
  41. 其實只要是在類的繼承中,無論抽象還是實體,都需要符合這個規則的。在這個繼承實驗中隨時刪掉或是加上abstract的首碼,結果都沒有變化。個人覺得“實體類必須有明確的建構函式”一句實在是無法把這個情況表達清楚,所以廣大求職者還是寫得清楚些好。     
  42.   
  43. 我喜歡的寫法是“可以繼承,但是和實體類的繼承一樣,也要求父類可繼承,並且擁有子類可訪問到的構造器。”         
  44. ---------------------        
  45.  如果有哪位朋友發現本文的紕漏,還望不吝賜教。在此謝過。     
  46.   
  47. 另:如需轉載請註明出處。   

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.