[英]Object initialization in Java
考慮以下代碼。
public class Skyler {
Skyler s1=new Skyler();
public static void main(String asd[]){
Skyler s2=new Skyler();
}
}
它生成java.lang.StackOverflowError
異常。 為什么?
請考慮以下代碼。
public class Skyler {
Skyler s1=new Skyler();
static Skyler s2=new Skyler();
Skyler(){
System.out.println("const");
}
public static void main(String sdp[]){}
}
這也會生成相同的java.lang.StackOverflowError
異常。 為什么?
這兩個例外的理由是否相同?
每次創建Skyler
實例時,都會初始化該實例的s1
成員,這將創建另一個Skyler
實例,該實例初始化該另一個實例的s1
成員,從而創建另一個Skyler
實例,依此類推......
換句話說,您對Skyler
構造函數有一個無限的調用鏈,這會導致StackOverflowErr
。
刪除Skyler s1=new Skyler();
。使用你的代碼,Skyler類有一個類型為Skyler的變量,然后它會一次又一次地創建一個Skyler,所以存在StackOverflowException
。
檢查邏輯,你創建一個新的Skyler
,這有什么作用? 它創造了一個新的Skyler
,令人驚訝的是這個新的Skyler
創造了另一個新的Skyler
。 這一切都來自你的線Skyler s1=new Skyler();
(非靜態的那個),它遞歸地創建了Object Skyler
endles實例。
Skyler類調用自己的構造函數。 因此,在創建Skyler的實例時,會創建另一個Skyler實例,依此類推......結果是StackOverflow。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.