《java編程思想系列之4》 複用類

一、組合語法

編譯器並不是簡單的爲每一個引用都創建默認對象,這一點是很有意義的,因爲若真的那樣做的話,就會在許多情況下增加不必要的負擔。如果想要初始化這些引用,可以在代碼的下列位置進行:
(1)在定義對象的地方。這意味着它們總能在構造器調用之前完成初始化
(2)在類的構造器中
(3)就在正要使用這些對象之前,這種方式成爲惰性初始化。在聲稱對象不值得或者不必要每次都生成對象的情況下,這種方式可以減少額外的負擔
(4)使用實例初始化

二、繼承語法
1、初始化基類

當創建了一個導出類的對象的時候,該對象包含了一個基類的子對象。這個子對象與你用基類直接創建的對象一樣。二者的區別在於,後者來自於外部,而基類的子對象被包裝在導出類的對象內部。

在構造器中調用基類的構造器來執行初始化,二基類構造器具有執行基類初始化所需要的所有知識和能力。java會自動在導出類的構造器中插入對基類構造器的調用

所有的基類在導出類的構造器可以訪問它之前,就已經完成了初始化:
基類構造器:(a)總是會被調用 (b)在導出類的構造器之前被調用

2、帶參數的構造器

(1)如果沒有默認的基類構造器,或者想用一個帶參數的基類構造器,就必須用關鍵字super顯式的編寫調用基類構造器的語句,並且配以適當的參數列表。
(2)調用基類的構造器必須是你在導出類構造器中要做的第一件事。

三、代理




(1)將一個對象置於索要構造的類中(類似組合)
(2)在新類中暴露了該成員對象的所有方法(類似繼承)

四、結合使用組合和繼承

1、確保正確清理
2、名稱屏蔽

(1)如果java的基類擁有某個已經多次被重載的方法名稱,那麼在導出類中重新定義該方法名稱不會屏蔽在基類中的任何版本(這一點和c++不同)
(2)java SE5新增加了@Override註解,它不是關鍵字,但是可以把它當做關鍵字使用。當想要覆寫某個方法時候,可以選擇添加該註解,當你不留心重載而非覆寫了該方法的時候,編譯器就好生成一條錯誤消息:

五、在組合與繼承之間選擇
(1) “is-a”--->繼承
(2) “has-a”---->組合

六、protected關鍵字

七、向上轉型

八、final關鍵字

1、final數據

1)一個永不改變的編譯時常量
2)一個在運行時被初始化的值,而你不希望它改變

對於基本類型,final使數組恆定不變,而用於對象引用,final使引用恆定不變。一旦引用被初始化指向一個對象,就無法再把它改爲指向另一個對象。然而,對象其自身卻是可以被修改的。

我們不能因爲某數據是final的就認爲編譯時就可以知道它的值。

(1)空白final
java允許生成“空白final”,所謂空白final是指被聲明爲final但又未給定初值的域。無論什麼情況,編譯器都確保空白final在使用前必須被初始化。

(2) final參數

java允許在參數列表中以聲明的方式將參數指明爲final。這意味着你無法再方法中更改參數引用所指向的對象。(這一特性主要用來向匿名內部類傳遞數據)

2、final方法

使用final方法的原因有兩個:
1)把方法鎖定,以防止任何繼承類修改它的含義
2)效率

(1)final和private關鍵字

類中所有的private方法都隱式的指定爲final的。由於無法取得private方法,所以也就無法覆蓋它。

“覆蓋”只有在某方法是基類的接口的一部分時候纔會出現。即,必須能將一個對象向上轉型爲它的基本類型並調用相同的方法。如果某方法爲private,它就不是基類的接口的一部分。它僅是一些隱藏於類中的程序代碼,只不過是具有相同的名稱而已。

3、final類

1)當將某個類的整體定義爲final的時候,就表明了你不打算繼承該類,二期也不允許別人這麼做。
2)由於final類禁止繼承,所以final類中所有的方法都會隱式指定爲final的,因爲無法覆蓋它們。在final類中科院給方法添加final修飾詞,蛋這不會增添任何意義。

九、初始化及類加載

一般來說,類的代碼在初次使用時候才加載。這通常是指加載發生於創建類的第一個對象之時,但是當訪問static域或static方法的時候,也會發生加載。

構造器也是static方法,儘管static關鍵字沒有顯式的寫出來。更準確的講,類是在任何static成員被訪問的時候被加載的。


發佈了26 篇原創文章 · 獲贊 0 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章