Static和Final修饰类属性变量及初始化 |
||||||
1.static 润饰一个属性字段,那么这个属性字段将成为类 本身的资源,public 润饰为共有的, 可以在类的外部通过test.a来 拜访此属性;在类内部任何地方 可以 使用.假如被 润饰为private私有,那么不得不在类内部 使用.
假如属性被 润饰为static静态类资源,那么这个字段永远惟独一个,也便是说 无论你new test()多少个类的对象,操作的永远都只不过属于类的那一块内存资源.例如:
后果是3个0
2.final 用于申明属性, 步骤和类,分别 示意属性一旦被 调配内存空间就必须初始化而且以后不可变, 步骤一旦定义必须有实现代码而且子类里不可被 遮蔽,类一旦定义不能被定义为 形象类或是接口,由于不可被继承 。
而你的代码里对final 润饰的属性进行了 批改,所以 舛误.
3. 被final 润饰而没有被static 润饰的类的属性变量不得不在两种状况下初始化:
a.在它被定义的时候,例:
b.在 构造函数里初始化,例:
4.同时被final和static 润饰的类的属性变量不得不在两种状况下初始化:
a.在它被定义的时候,例:
b.在类的静态块里初始化,例:
5. 综合第三第四缘由:
第三条:当这个属性被 润饰为final,而非static的时候,它属于类的实例对象的资源,当类被加载进内存的时候这个属性并没有给其 调配内存空间,而只不过定义了一个变量a,惟独当类被实例化的时候这个属性才被 调配内存空间,而实例化的时候同时执行了 构造函数,所以属性被初始化了,也就 相符了当它被 调配内存空间的时候就需求初始化,以后不再转变的条件.
第四条:当类的属性被同时被 润饰为static和final的时候,他属于类的资源,那么便是类在被加载进内存的时候(也便是 利用程序启动的时候)就要已经为此属性 调配了内存,所以此时属性已经存在,它又被final 润饰,所以必须在属性定义了以后就给其初始化值.而 构造函数是在当类被实例化的时候才会执行,所以用 构造函数,这时候这个属性没有被初始化.程序就会报错.而static块是类被加载的时候执行,且只执行这一次,所以在static块中 可以被初始化. |