1. 程式人生 > 資訊 >中國自動駕駛公司輕舟智航釋出第三代 L4 自動駕駛硬體方案:360 度無盲區感知

中國自動駕駛公司輕舟智航釋出第三代 L4 自動駕駛硬體方案:360 度無盲區感知

程式碼塊

程式碼塊可以看成一個只有方法體的方法,都是優先於類的構造器而執行。程式碼塊有靜態程式碼塊和非靜態程式碼塊。樣式如下

//下面就是一段非靜態程式碼塊(普通程式碼塊)
{
    //方法體
};//分號可加可不加
static{//這是靜態程式碼塊
    //方法體
};//分號可加可不加

作用

程式碼塊可以看成一種另類的構造器,當我們使用的多個構造器有很多重複語句,比如都列印一句話,就可以放在程式碼塊中,這是一種對構造器的補充機制,大大減少了構造器的冗餘程式碼,看起來更加的簡潔。

程式碼塊注意事項

  1. 加了static的程式碼塊叫靜態程式碼塊,沒有static修飾就是非靜態程式碼塊。靜態程式碼塊隨著類的載入而載入,並且只會執行一次。普通程式碼塊隨著每個物件的例項化而執行。

  2. 類何時載入

    1. 呼叫靜態成員的時候
    2. 建立例項化物件
    3. 建立子類物件,父類也會載入
  3. 建立物件的時候,就含有普通程式碼塊的隱式呼叫,每建立一個物件,便會執行一次普通程式碼塊,如果僅使用類的靜態成員就不會執行。

  4. 建立一個物件時,一個類的呼叫順序

    1. [靜態部分]靜態程式碼塊和靜態屬性初始化,這兩者優先順序一樣,誰寫在前面就先呼叫誰
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. **[構造器(構造方法)]**最後執行,呼叫構造方法
  1. 構造器中已經隱含了super()和普通程式碼塊的執行
    class X {//父類
        //....
    }
    class A extends X{//子類
        public A (){
            //super ();
            //普通程式碼塊
            //構造方法
        }
    }
靜態相關的程式碼塊和屬性初始化,在類的載入中完畢就執行了,因此就優先於普通程式碼塊和構造器。
  1. 例子使用上面的程式碼,父類X子類A,當建立子類A的物件時,整個的執行順序是什麼。

    1. 父類的靜態部分 (靜態程式碼塊和靜態屬性初始化)
    2. 父類的非靜態部分 (非靜態程式碼塊和非靜態屬性初始化)
    3. 父類構造器
    4. 子類靜態部分 (靜態程式碼塊和靜態屬性初始化)
    5. 子類非靜態部分 (非靜態程式碼塊和非靜態屬性初始化)
    6. 子類構造器

    如果是第二次建立A的物件,那麼上述步驟的1和4也就是靜態部分就不會重複執行,遵守靜態程式碼塊只執行一次

    在向上轉型的時候,如X x = new A();物件x在執行的時候是子類A物件,因此在程式中還是會如上述步驟一樣123456這樣跑下來

  2. 靜態程式碼塊只能呼叫靜態成員,非靜態程式碼塊可以呼叫所有成員

    成員:就是類的屬性(變數)、方法的一個統稱