中國自動駕駛公司輕舟智航釋出第三代 L4 自動駕駛硬體方案:360 度無盲區感知
阿新 • • 發佈:2021-11-08
程式碼塊
程式碼塊可以看成一個只有方法體的方法,都是優先於類的構造器而執行。程式碼塊有靜態程式碼塊和非靜態程式碼塊。樣式如下
//下面就是一段非靜態程式碼塊(普通程式碼塊)
{
//方法體
};//分號可加可不加
static{//這是靜態程式碼塊
//方法體
};//分號可加可不加
作用
程式碼塊可以看成一種另類的構造器,當我們使用的多個構造器有很多重複語句,比如都列印一句話,就可以放在程式碼塊中,這是一種對構造器的補充機制,大大減少了構造器的冗餘程式碼,看起來更加的簡潔。
程式碼塊注意事項
-
加了static的程式碼塊叫靜態程式碼塊,沒有static修飾就是非靜態程式碼塊。靜態程式碼塊隨著類的載入而載入,並且只會執行一次。普通程式碼塊隨著每個物件的例項化而執行。
-
類何時載入
- 呼叫靜態成員的時候
- 建立例項化物件
- 建立子類物件,父類也會載入
-
建立物件的時候,就含有普通程式碼塊的隱式呼叫,每建立一個物件,便會執行一次普通程式碼塊,如果僅使用類的靜態成員就不會執行。
-
建立一個物件時,一個類的呼叫順序
- [靜態部分]靜態程式碼塊和靜態屬性初始化,這兩者優先順序一樣,誰寫在前面就先呼叫誰
class A{
private int a = 0;//靜態屬性(變數)初始化
static { }; //靜態程式碼塊
}
上面這個A類就會先執行a = 0,然後再執行靜態程式碼塊裡的內容 2.**[非靜態部分]**非靜態程式碼塊和非靜態屬性初始化,和上面一樣,誰在前面誰就先執行,但是執行的優先順序是低於[靜態部分]的
class A{
//非靜態部分
{/*非靜態程式碼塊*/}; //1
String name; //非靜態屬性初始化 //2
//靜態部分
private int a = 0;//靜態屬性(變數)初始化 //3
static {/*靜態程式碼塊*/}; //4
}
執行順序就是3 --> 4 --> 1 --> 2
3. **[構造器(構造方法)]**最後執行,呼叫構造方法
- 構造器中已經隱含了super()和普通程式碼塊的執行
class X {//父類
//....
}
class A extends X{//子類
public A (){
//super ();
//普通程式碼塊
//構造方法
}
}
靜態相關的程式碼塊和屬性初始化,在類的載入中完畢就執行了,因此就優先於普通程式碼塊和構造器。
-
例子使用上面的程式碼,父類X子類A,當建立子類A的物件時,整個的執行順序是什麼。
- 父類的靜態部分 (靜態程式碼塊和靜態屬性初始化)
- 父類的非靜態部分 (非靜態程式碼塊和非靜態屬性初始化)
- 父類構造器
- 子類靜態部分 (靜態程式碼塊和靜態屬性初始化)
- 子類非靜態部分 (非靜態程式碼塊和非靜態屬性初始化)
- 子類構造器
如果是第二次建立A的物件,那麼上述步驟的1和4也就是靜態部分就不會重複執行,遵守靜態程式碼塊只執行一次。
在向上轉型的時候,如X x = new A();物件x在執行的時候是子類A物件,因此在程式中還是會如上述步驟一樣123456這樣跑下來
-
靜態程式碼塊只能呼叫靜態成員,非靜態程式碼塊可以呼叫所有成員
成員:就是類的屬性(變數)、方法的一個統稱