關於static和final修飾類的屬性變量以及變量的初始化

1.static修飾一個屬性字段,那麼這個屬性字段將成爲類本身的資源,public修飾爲共有的,可以在類的外部通過test.a來訪問此屬性;在類內部任何地方可以使用.如果被修飾爲private私有,那麼只能在類內部使用.

public class Test{
  public static int a;
  private Test(){
    a=0;
  }
}
   如果屬性被修飾爲static靜態類資源,那麼這個字段永遠只有一個,也就是說不管你new test()多少個類的對象,操作的永遠都只是屬於類的那一塊內存資源.例如:
   Test t1=new Test();
   t1.a=10;
   Test t2=new Test();
  
   System.out.println(t1.a);
   System.out.println(t2.a);
   System.out.println(Test.a);

結果是3個0


2.final 用於聲明屬性,方法和類,分別表示屬性一旦被分配內存空間就必須初始化並且以後不可變,方法一旦定義必須有實現代碼並且子類裏不可被覆蓋,類一旦定義不能被定義爲抽象類或是接口,因爲不可被繼承。
  而你的代碼裏對final修飾的屬性進行了修改,所以錯誤. 

3. 被final修飾而沒有被static修飾的類的屬性變量只能在兩種情況下初始化:

     a.在它被定義的時候,例:

      public class Test{
         public final int a=0;
         private Test(){
         }
      }

      b.在構造函數裏初始化,例:

      public class Test{
         public final int a;
         private Test(){
             a=0;
         }
      }     

4.同時被final和static修飾的類的屬性變量只能在兩種情況下初始化:

     a.在它被定義的時候,例:

      public class Test{
         public final int a=0;
         private Test(){
         }
      }

      b.在類的靜態塊裏初始化,例:

      public class Test{
         public final int a;
         static{
             a=0;
         }
      }        

5.分析第三第四原因:

       第三條:當這個屬性被修飾爲final,而非static的時候,它屬於類的實例對象的資源,當類被加載進內存的時候這個屬性並沒有給其分配內存空間,而只是定義了一個變量a,只有當類被實例化的時候這個屬性才被分配內存空間,而實例化的時候同時執行了構造函數,所以屬性被初始化了,也就符合了當它被分配內存空間的時候就需要初始化,以後不再改變的條件.

       第四條:當類的屬性被同時被修飾爲static和final的時候,他屬於類的資源,那麼就是類在被加載進內存的時候(也就是應用程序啓動的時候)就要已經爲此屬性分配了內存,所以此時屬性已經存在,它又被final修飾,所以必須在屬性定義了以後就給其初始化值.而構造函數是在當類被實例化的時候纔會執行,所以用構造函數,這時候這個屬性沒有被初始化.程序就會報錯.而static塊是類被加載的時候執行,且只執行這一次,所以在static塊中可以被初始化.

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