属性的几种初始化方法

初始化属性变量的几种时机

  1. 定义时初始化;
  2. 构造器中初始化;
  3. 在使用之前初试化;
  4. 使用实例初始化。
package propertiesinit.one; public class Main { //1.定义时初始化definitionInit private int definitionInit=0; private int constructorInit; private String usingInit; private String instanceInit; //2.构造方法初始化constructorInit public Main() { constructorInit=0; } @Override public String toString() { //3.使用时初始化usingInit if(usingInit==null){ usingInit="usingInit"; } return usingInit; } { //4.实例初始化instanceInit instanceInit="instanceInit"; } }

执行c2.i会报错(编译期报变量未初始化错误),c.i能正常运行
public class Main { public static void main(String[] args) { // ClassAccess c; ClassAccess c = null, c2; // The static field ClassAccess.i should be accessed in a static way System.out.println(c.i); // Multiple markers at this line // - The static field ClassAccess.i should be accessed in a // static way // - The local variable c2 may not have been initialized // System.out.println(c2.i); } }class ClassAccess { private ClassAccess() { }public static int i = 1; }

注:ClassAccess c; 和ClassAccess c = null; 是有区别的,前者只是定义了c,后者不仅定义c,同时将c初始化为null。在code2中我们可以注意到,在c为null的情况下我们是可以正常访问引用类型静态成员的(这波操作很秀啊?)。
20180705注:
【属性的几种初始化方法】猜测:初始化会有两个动作一个是将引用指向类,一个将引用指向对象。c2未初始化也就没有将引用对应到类,故无法执行c2.i,而c1经过c1=null将c1对应到ClassAccess类,同时对应到一个空对象,i是静态变量,能通过类调用,经过这一步操作足矣。

    推荐阅读