初始化屬性變量的幾種時機
- 定義時初始化;
- 構造器中初始化;
- 在使用之前初試化;
- 使用實例初始化。
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是靜態變量,能通過類調用,經過這一步操作足矣。