簡體   English   中英

Java中的對象初始化

[英]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異常。 為什么?

這兩個例外的理由是否相同?

你經歷了一個循環,在這個循環中,構造函數將它自己調用為servaral次,直到它溢出為止。

例如:

在此輸入圖像描述

兩種情況都是一樣的。 它無休止地稱之為自我。

在這兩種情況下,只有一次區別是你提供了一個帶有print語句的默認no org構造函數,這樣你就可以看到print語句,直到你收到錯誤

每次創建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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM