0

同じエラー
First calssを与える次の 2 つのプログラムを検討してください。

public class Testing {    
    Testing t=new Testing();        
    public static void main(String args[]){   
        testing t1=new testing();  
    }
}

セカンドクラス:

class foo{
    void baz(){
        new testing();
    }
}
public class testing {
    testing t=new testing();    
    public static void main(String args[]){
    foo f=new foo();
        f.baz();
    }       
}

上記のコードはどのように次のエラーを出しますか?
クラスのインスタンスが再帰的に作成されていることは知っていますが、その方法を知りたいですか?

Exception in thread "main" java.lang.StackOverflowError
    at com.Testing.<init>(Testing.java:4)
    at com.Testing.<init>(Testing.java:4)

また、私たちが行う場合、なぜこれが起こらないのですか

    public class testing { 
    testing t2=new testing(); 
    testing t1=new testing(); 
    public static void main(String args[])
    {//anything}
    }

t1 では t2 オブジェクトを初期化する必要があり、その逆も同様ですか?

4

2 に答える 2

7

これが問題です:

public class Testing {    
    Testing t=new Testing();  
}

これはおおむね次のようになります。

public class Testing {
    Testing t;

    public Testing() {
        t = new Testing();
    }
}

これにより、再帰がより明確になります。コンストラクターは無条件に自分自身を呼び出します。

の各インスタンスにTestingは、の別のインスタンスへの参照が含まれていますTesting。これは問題になる必要はありませんが、の新しいインスタンスを作成しているため、ここにありますTesting。したがって、「最も外側の」インスタンスを作成すると、すぐに別のインスタンスの作成がトリガーされます...これにより、別のインスタンスの作成などがトリガーされます。

2つのクラスは、その点で大きな違いはありません。インスタンスを作成Testingすると、スタックオーバーフローが発生します。

編集:このコードについて(名前とフォーマットが改善されました):

public class Testing { 
    Testing t1 = new Testing(); 
    Testing t2 = new Testing(); 

    public static void main(String[] args) {
        //anything
    }
}

のインスタンスを作成しようとすると、同じ例外がスローされますTesting。ただし、「t1ではt2オブジェクトを初期化する必要がある」と言うのは誤りです。ここでは、変数間に相互依存関係はありません。各変数初期化子は個別のオブジェクトを作成します...しかし、これらのオブジェクトのそれぞれは、さらに2つのインスタンスを作成しようとしますTesting

メソッドを実行するためにのインスタンスTestingは必要ないmainことに注意してください-しかし、そのmainメソッドがnew Testing直接呼び出すか、を呼び出す他の何か呼び出すとnew Testing()、スタックオーバーフローが発生します。

于 2012-06-27T07:28:59.880 に答える
3

あなたのプログラムがいつ終わるかを考えたことはありません。最初のオブジェクトをインスタンス化しますが、インスタンス化するには、最初のオブジェクトに対して別のオブジェクトをインスタンス化する必要があります。したがって、スタックはいつか爆発します。

最初のオブジェクト(2番目のオブジェクトが必要(3番目のオブジェクトが必要(4番目のオブジェクトが必要)))そしてそれは続きます。

于 2012-06-27T07:29:38.030 に答える