JAVA程序設計——對象、單例設計模式

這周只總結兩個難點:對象的創建、賦值與單例設計模式:

目錄

對象創建的方式

1.根據new關鍵字來創建一個新的類:

 2.使用newinstance方法:

3.兩種方法創建的異同:

單例設計模式

對象的使用與垃圾回收機制

1.對象賦值

2.對象的垃圾回收



對象創建的方式

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類用爲單例構造模式)

  1. 因爲需要單例構造,那麼每次new生成新對象時,系統都會進行構造方法對新對象進行實例化。
  2. 此時不利於將對象單例化,因爲每次調用根據構造方法都會生成一個新的對象,所以必須將構造方法私有化!確保外界構造的新對象時不可通過此構造方法來進行生成對象。
  3. 但是此時也不會保證對象單一化。所以考慮將構造新的對象封裝起來,在本類中設立一個GetNewInstance方法並在類中設立一個私有類的靜態Cat類的對象,在此靜態的原因參考:因爲無法進行new關鍵字生成一個新的對象(構造方法私有化!),所以只能通過類名.方法進行調用方法,通過方法返回值得到新的對象。因爲要使用類名.方法調用,所以只能調用類中的靜態方法,既然是靜態方法,那麼只能調用靜態成員變量。
  4. 因爲構造方法私有,所以可以在類中調用構造方法。首先將類中的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對象只被生成了一次,所以成爲單例設計模式成功!

總結來說,單例設計模式的一般步驟在上述代碼註釋中:

  1. 設計私有構造方法
  2. 設計私有靜態成員類變量
  3. 設計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()函數

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章