Java 複用類(7)

複用代碼是Java衆多引入注目的功能之一。但要想成爲極具革命性的語言,僅僅可以複製代碼並對之加以改變是不夠的,它還必須可以作更多的事情。安全

1.組合語法

  • 將對象引用置於新類中.
  • 初始化對象引用:1.定義時初始化;2.構造器初始化;3.使用以前(惰性初始化);4.實例初始化(代碼塊).

2.繼承語法

  • 採用extends關鍵字實現.
  • 採用現有類的類型來建立新類,無需改變現有類的形式.
  • 即便一個類只有包訪問權限,其public main仍然是可訪問的.
  • 繼承並不僅是複製基類的接口.當建立了一個當初類的對象時,該對象包含了一個基類的子對象,和直接建立的基類對象是同樣的,區別在於,後者來自外部,而基類的子對象被包裝在導出類對象內部.
  • 基類初始化:構造器.若是沒有,會合成一個默認的構造器,該構造器將調用基類的構造器.
  • 調用帶參構造器:super.
  • 調用基類構造器必須是在導出類構造器中要作的第一件事(若是作錯了,編譯器會提醒).

3.代理

  • Java語言不支持直接代理.
  • 將一個成員的對象置於所要構造的類中(就像組合),但於此同時在新類中暴露了該成員對應的全部方法(就像繼承).

4.結合使用組合與繼承

  • 確保正確清理:try{}finally,先清理導出類,在清理基類.
  • 若是Java的基類擁有某個已被屢次重載的方法名稱,那麼在導出類中從新定義個該方法名稱並不會屏蔽其在基類中的任何版本.
  • 使用@Override(不是關鍵字)註解覆蓋與基類徹底相同的特徵簽名及返回類型具備相同名稱的方法.

5.在組合與繼承之間選擇

  • 組合和繼承都容許在新的類中放置子對象,組合是顯示地這樣作,而繼承則是隱式地作.
  • 組合技術一般用於想在新類中使用現有類的功能而非他的接口這種情形.
  • 在繼承的時候,使用某個現有類,並開發一個它的特殊版本.
  • "is-a"(是一個)的關係是用繼承來表達的,而"has-a"(有一個)的關係是用組合來表達的.

6.protected關鍵字

  • 將某些事物儘量對這個世界隱藏起來,但仍然容許導出類的成員來訪問它們.
  • 就類用戶而言,這是private的,但對於任何繼承與此類的導出類或其餘任何位於同一個包內的類來講,它倒是能夠訪問的(protected提供了包內訪問權限).

7.向上轉型

  • 將根置於頁面的頂端,而後逐漸向下.由導出類轉型成基類,在繼承圖上是向上移動的,所以通常稱爲向上轉型(老是安全的).
  • 在向上轉型的過程當中,類接口中惟一可能發生的事情是丟失方法,而不是獲取它們.

8.final關鍵字

  • 沒法改變的(不想改變的理由:設計或效率).
  • final數據:對於基本數據類型,final使數值恆定不變;而對用對象引用,final使引用恆定不變(沒法改成指向另外一個對象,對象自身能夠被修改).
  • static final 域只佔據一段不能改變的存儲空間,基本用全寫大寫字母命名.
  • 空白final:聲明時爲賦值,使用前必須被初始化(提供了更大的靈活性).
  • final參數:沒法在方法中更改參數引用所指向的對象(主要用來向匿名內部類傳遞參數).
  • final方法:把方法鎖定,防止任何繼承類修改它的含義.
  • 類中全部的private方法都隱式地被制定是final的.
  • 覆蓋只有在某方法是基類接口的一部分時纔會出現,不然,僅具備相同名稱(基類方法設置爲private是由於它所歸屬的類的組織結構的緣由).
  • final類:不容許繼承(對該類的設計永不須要作任何變更/安全).
  • 不論類是都被定義爲final,相同的規則都適用於定義爲final的域.
  • final類中全部的方法都隱式指定爲師final的.
  • 忠告:慎用final.

9.初始化及類的加載

  • 在許多傳統語言中,程序是做爲啓動過程的一部分馬上被加載的,而後是初始化,緊接着程序開始運行.
  • 類的代碼在初次使用時才加載,即加載發生於建立類的第一個對象之時,或者static域或方法被訪問時.

ENDide

相關文章
相關標籤/搜索