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块中 可以被初始化.