-2

同じクラスのインスタンス内に非静的インスタンスを作成すると、スタック オーバーフロー エラーが発生するのはなぜですか??

public class ObjectTest {
    ObjectTest instanceObj = new ObjectTest("Outside");

    public ObjectTest(String s) {
        System.out.println(s);
    }

    public static void main(String[] args) {
        ObjectTest localObj = new ObjectTest("Inside");
    }
}

しかし、問題は以下の変更で解決されます:

static ObjectTest instanceObj = new ObjectTest("Outside");

instanceObj新しいオブジェクトを参照に割り当てるときに、最初のケースで循環依存が発生するように理解されています

誰かが全体を明確にできますか?? 静的参照の循環依存が発生しないのはなぜですか??

4

3 に答える 3

6

instanceObjが静的でない場合、 のコンストラクターObjectTestは anotherObjectTestを作成しObjectTest、それが another を作成し、無限に続きます。静的な場合は、クラスinstanceObj全体に対して1 つだけ作成されます。結局のところ、静的です。:) instanceObj が静的で、それが作成されると、それ自体である静的な instanceObj が既にあります。慣れるには少し時間がかかりますが、紙に書いてキーワードの意味を明確にすることが役立つ場合があります。ObjectTestObjectTeststatic

于 2013-03-26T18:38:14.937 に答える
2

オブジェクト内にオブジェクトを作成し、オブジェクト内にオブジェクトを作成するためです。これは、2 つの鏡が互いの前にあるときの無限の鏡像のようなものです。

静的オブジェクトについては、クラスのインスタンスではありません。static オブジェクトはクラス レベルで作成されます。

SingleTon クラスを設計する際に、同じクラスのそのような静的オブジェクトを使用します。

于 2013-03-26T18:38:26.290 に答える
1

公開したコードは次とほぼ同じであるためです。

public class ObjectTest {
    ObjectTest instanceObj;

    public ObjectTest(String s) {
        instanceObj = new ObjectTest("Outside"); // creating another object executing this constructor again
        System.out.println(s);
    }

    public static void main(String[] args) {
        ObjectTest localObj = new ObjectTest("Inside");
    }

}

フィールドを静的フィールドに変更するときは、次のようにします。

public class ObjectTest {
    static ObjectTest instanceObj;

    static {
        instanceObj = new ObjectTest("Outside");
    }    

    public ObjectTest(String s) {
        System.out.println(s);
    }

    public static void main(String[] args) {
        ObjectTest localObj = new ObjectTest("Inside");
    }

}

コンストラクターを 1 回だけ実行します。

于 2013-03-26T18:44:42.650 に答える