Java 初始化與清理(5)

Seasons20發表於2019-01-19

隨著計算機革命的發展,“不安全”的程式設計方式已逐漸成為程式設計代價高昂的主因之一。

1.用構造器確保初始化

  • 構造器:在建立物件時被自動呼叫的特殊方法.
  • 構造器命名問題:1.所取得任何名字可能與類的某個成員命名衝突;2.呼叫構造器是編譯器的責任,所以應該讓編譯器知道該呼叫哪個方法.
  • 構造器命名:與類名相同,所以”每個方法首字母小寫”的程式設計風格不適用於構造器.
  • 構造器沒有返回值(new表示式返回了對新建物件的引用,但構造器本省並沒有返回任何值).

2.方法過載

  • 目的:為了讓方法名相同而形式引數不同的構造器同時存在.
  • 方法過載是構造器所必需的,但亦可用於其他方法.
  • 區分:引數型別列表,引數順序(程式碼難以維護),涉及基本型別的過載(易混淆),返回值(為了副作用而呼叫就會忽略其返回值 ×)

3.預設構造器

  • 如果類中沒有構造器,編譯器會自動建立一個預設構造器.
  • 如果已有構造器,則不會建立.

4.this關鍵字

  • 為了能用簡便,物件導向的語法來編寫程式碼,編譯器做了一些幕後工作,他把”所操作物件的引用”作為第一個引數傳給方法(注:一般是通過物件的引用來呼叫方法,編譯之後通過物件來呼叫).
  • 只能在方法內部使用,表示對”呼叫方法的那個物件”的引用.
  • 如果在方法內部,呼叫同一個類的另一個方法,則不必使用this,直接呼叫即可.
  • 需要返回當前物件的引用時,return this;.
  • 將當前物件作為引數傳遞給其他物件.
  • 在構造器中呼叫構造器(只能呼叫一個,且必須將構造器的呼叫至於最起始處).
  • static方法:沒有this的方法.

5.清理:終結處理和垃圾回收

  • finalize().
  • 物件可能不被垃圾回收.
  • 垃圾回收並不等於”析構”.
  • 垃圾回收只與記憶體有關.
  • 引用計數:常用開說明垃圾收集的工作方式.
  • 複製式回收器:效率低(1,空間大;2,複製).
  • 標記-清掃 模式.

6.成員初始化

  • 區域性變數必須進行初始化.
  • 類的資料成員(全域性變數),基本型別會預設有一個初始值,物件引用會獲得特殊值null.
  • 指定初始化:定義的時候直接賦值或通過方法呼叫賦值.

7.構造器初始化

  • 通過構造器來進行初始化(無法阻止自動初始化的進行,它將在構造器呼叫之前發生).
  • 變數定義的先後順序決定了初始化的順序.
  • 靜態資料初始化:只有在第一個物件建立(或者第一次訪問靜態資料)的時候,才會被初始化,僅執行一次.
  • 顯式的靜態資料初始化:靜態程式碼塊.
  • 非靜態例項初始化:普通程式碼塊(匿名內部類的chu`shi`hua).
  • 構造器沒有顯式地使用static,但也是靜態方法.
  • 物件的建立過程
    1.當詩詞建立物件或者類的靜態方法/靜態域首次被訪問時,Java直譯器查詢類路徑,定位.class檔案.
    2.載入.class,有關靜態初始化的所有動作被執行(首次載入時進行一次).
    3.用new操作符建立物件,在堆上為物件分配足夠的儲存空間.
    4.儲存空間清零,為物件中的全域性變數賦值.
    5.執行所有出現於欄位定義處的初始化動作.
    6.執行構造器.

8.陣列初始化

  • 陣列:相同型別的,用一個識別符號名稱封裝到一起的一個物件序列或基本型別資料序列.通過方括號下標操作符來定義和使用的.
  • 編譯器不允許指定陣列的大小.
  • 初始化表示式:由一對花括號括起來的值組成.在這種情況下,儲存空間的分配(等價於使用new)由編譯器負責.
  • 固有成員length,只能訪問不能修改.
  • 可變引數列表.

9.列舉型別

  • 列舉型別的例項是常量,按照命名慣例使用大寫字母表示(多個單詞用下劃線隔開).
  • 為了使用enum,需要建立一個該型別的引用,並將其賦值給某個例項.
  • 編譯器自動新增toString(),ordinal()(宣告順序),values()(按宣告順序,產生由常量構成的陣列)方法.
  • 與switch配合使用.

END

相關文章