屬性的幾種初始化方法

初始化屬性變量的幾種時機

  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是靜態變量,能通過類調用,經過這一步操作足矣。

發佈了47 篇原創文章 · 獲贊 4 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章