java遺珠之欄位初始化
版權宣告:本文為博主原創文章,未經博主允許不得轉載。https://blog.csdn.net/lastsweetop/article/details/82665398
欄位初始化相對簡單只是定義的時候設定初始化的變數就OK了
public class BedAndBreakfast { // initialize to 10 public static int capacity = 10; // initialize to false private boolean full = false; }
但是這種太過簡單,一些複雜的比如包含丟擲異常,邏輯控制等初始化操作就無法實現了。
為了實現一些複雜的初始化操作,例項變數在構造方法中可以初始化。儘管類變數也可以在構造方法中可以初始化,但是一是構造方法每次呼叫就會重置類變數,二是類變數的使用也不需要先進行呼叫構造方法再使用。
因此就需要一種機制在不用呼叫構造方法就可以實現類變數的複雜初始化。這個時候靜態初始化塊就出現了:
static { // whatever code is needed for initialization goes here System.out.println("static initialization block"); }
靜態化初始化塊在一個類中可以有多個,執行時系統會保證他們按照原始碼中的出現順序一一呼叫。
有時候初始化需要被重複呼叫,比如在之後就像類變數的重置,那麼就需要可以複用的機制,那麼靜態初始化方法就出現了
class Whatever { public static int myVar = initializeClassVariable(); private static int initializeClassVariable() { // initialization code goes here return 0; } }
例項變數可以通過構造器來進行初始化,但是想要多個建構函式想呼叫相同的初始化程式碼,你就可以考慮使用初始化塊,編譯器會將初始化塊拷貝到多個構造器中。
{ // whatever code is needed for initialization goes here System.out.println("initializing instance members"); }
同樣的想要複用這段程式碼塊也可以把它提取成方法,但是最好設成final的,這樣子類無法重寫,否則對同一個變數子類和父類的初始化值不同可能會引起混淆。
public class Whatever2 { private int myVar = initializeInstanceVariable(); public int getMyVar() { return myVar; } protectedfinal int initializeInstanceVariable() { // initialization code goes here return 0; } }