這個問題在這里已經有了答案: 從非靜態背景關系呼叫同一類的java建構式會導致遞回但使用靜態它可以正常作業嗎? (1 個回答) 為什么具有相同類的實體變數的此類會導致 StackOverflowError 而具有相同型別的靜態變數的類似類不會?[重復] (2個答案) 5 天前關閉。
執行以下代碼時,java.lang.StackOverflowError會引發例外。
類中的 main() 方法Something:
class Something {
public static void main(String args[]) {
System.out.println(Color.RED);
System.out.println(Color.GREEN);
System.out.println(new Color().BLUE);
}
}
這是課程Color:
class Color {
public static final Color RED = new Color();
public static final Color GREEN = new Color();
public final Color BLUE = new Color();
}
但是當我把它放在static后面final時public final Color BLUE = new Color();,程式可以正常運行而不會拋出StackOverflowError。為什么它不拋出例外?是不是當 JVM 識別出某個static物件正在參考自己時,它應該停止?Java 是如何處理這個問題的?
uj5u.com熱心網友回復:
沒有static:
class Color {
public final Color BLUE = new Color();
}
要創建Color(via ) 的實體,您必須為該欄位new Color()創建一個實體;要創建 的實體,您必須為該欄位創建一個實體;要創建 的實體,您必須為欄位創建一個實體,等等。看到問題了嗎?ColorBLUEColorColorBLUEColorColorBLUE
如果你做到了static:
class Color {
public static final Color BLUE = new Color();
}
每次BLUE創建Color. 初始化類時會創建一個實體,Color就是這樣。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/446220.html
下一篇:控制臺應用程式未在AppDomain.CurrentDomain.UnhandledException中使用NLOG記錄錯誤
