這周只總結兩個難點:對象的創建、賦值與單例設計模式:
目錄
對象創建的方式
1.根據new關鍵字來創建一個新的類:
這種方式一般沒有什麼限制,對於之前講過的構造方法的重載也同樣適用。
2.使用newinstance方法:
ClassName NewClass = ClassName.Class.newinstance();
ClassName NewClass = (ClassName)Class.forName("ClassName").newinstance()
以上兩種對象創建的方法都使用了instance()這個方法。
3.兩種方法創建的異同:
- new關鍵字對於任何構造方法都可以進行構造,上一節中已經寫過構造方法重載與構造方法
- instance方法只適用於無參構造
- instance方法的本質是對new關鍵字執行的操作分成了兩部,首先實現類加載,之後將類進行實例化。
- newInstance: 弱類型。低效率。只能調用無參構造
- new: 強類型。相對高效。能調用任何public構造
單例設計模式
在它的核心結構中只包含一個被稱爲單例的特殊類。通過單例模式可以保證系統中,應用該模式的類一個類只有一個實例。即一個類只有一個對象實例。
首先注意幾點:
每一個這個模式的類只有一個實例,也就是說,該類只能實例化一個對象,所以我們的構造思路如下:
(以下將Cat類用爲單例構造模式)
- 因爲需要單例構造,那麼每次new生成新對象時,系統都會進行構造方法對新對象進行實例化。
- 此時不利於將對象單例化,因爲每次調用根據構造方法都會生成一個新的對象,所以必須將構造方法私有化!確保外界構造的新對象時不可通過此構造方法來進行生成對象。
- 但是此時也不會保證對象單一化。所以考慮將構造新的對象封裝起來,在本類中設立一個GetNewInstance方法並在類中設立一個私有類的靜態Cat類的對象,在此靜態的原因參考:因爲無法進行new關鍵字生成一個新的對象(構造方法私有化!),所以只能通過類名.方法進行調用方法,通過方法返回值得到新的對象。因爲要使用類名.方法調用,所以只能調用類中的靜態方法,既然是靜態方法,那麼只能調用靜態成員變量。
- 因爲構造方法私有,所以可以在類中調用構造方法。首先將類中的cat對象地址賦值爲NULL,然後在GetNewInstance方法中,判斷一下是否cat對象已經存在如果存在就直接返回該對象地址,否則就調用類中方法。
以下代碼給出測試與步驟:
class Cat{
///1.私有構造方法(外界不可訪問)
private Cat() {
System.out.println("A new instance created!");
}
///2.外界不可訪問,所以只能本類中訪問,所以需要一個私有對象!
private static Cat Instance = null;
///3.創建一個共有訪問的獲得實例的方法
public static Cat GetNewinstance() {
if(Instance==null)
Instance = new Cat();///自己創建自己
return Instance;
}
}
那麼在主類中進行測試:
輸出結果發現:
A new instance created!
Test.Cat@52cc8049
Test.Cat@52cc8049
Cat對象只被生成了一次,所以成爲單例設計模式成功!
總結來說,單例設計模式的一般步驟在上述代碼註釋中:
- 設計私有構造方法
- 設計私有靜態成員類變量
- 設計GetNewInstance()方法
對象的使用與垃圾回收機制
1.對象賦值
運行如下代碼:
得到結果:
A New Instance Created
A New Instance Created
leglenth is 2
leglenth is 4
下面進行對象的賦值:
增加a=b的賦值操作,可以觀察到此時的輸出結果爲:
A New Instance Created
A New Instance Created
leglenth is 4
leglenth is 4
由此可以得出a=b的賦值操作,實際是將b的地址賦值給了a,那麼a的地址就被覆蓋爲b的地址,在C中學習可以知道地址如果改變一個變量的內容就會徹底改變。
對此做出思考:
如果地址爲空,是否可以調用一些屬性或者方法?——不可
a被覆蓋後,a的地址去哪了?——垃圾回收
2.對象的垃圾回收
1.java系統中是自帶垃圾回收的,不過該方法觸發只在內存接近飽和的時候纔會調用垃圾回收機制。
2.手動垃圾回收:
system.gc()函數