2017-02-17 7 views
0

インスタンス変数はスタック上にあり、オブジェクトはヒープ上に移動し、オブジェクト参照はスタック上に移動します。右?しかし、インスタンス変数がオブジェクトへの参照であればどうでしょうか?同様にvar c:オブジェクトを参照するインスタンス変数

class clony implements Cloneable { 

    clony c = new clony(); 

    @Override 
    protected Object clone() throws CloneNotSupportedException { 
     return super.clone(); 
    } 
} 

class tst2 { 

    public static void main(String[] args) throws CloneNotSupportedException { 
     clony j1 = new clony(); 
    } 
} 

ヒープになると、なぜオーバーフローエラーがスローされてスタックするのですか?

答えて

0

これは、スタックがメソッド呼び出しの追跡にも使用されるためです。メソッド(この場合はクラスのデフォルトのコンストラクタ)を呼び出すたびに、その目的のために特定の情報がスタックに追加されます。無限再帰(コンストラクタを持っているように)が無ければ、それはスタックPDQをいっぱいにします。

2

参照cは、クラスclonyのフィールドです。つまり、リファレンスはclonyオブジェクトに割り当てられたメモリ領域内のヒープに格納されます。

そして、あなたのプログラムが無限に自分自身を構築clonyので、スタックオーバーフロー例外スロー:あなたは新しいclonyオブジェクトを作成し、cをフィールドに割り当てるclonyのコンストラクタ内部:その後、何度も何度も同じことを行いますどちらを。

0

私はこれだと思う:

clony c = new clony(); 

はあなたに例外を与えます。

new clony() also has clony c = new clony() 

内側...無限になります。

ところで、クラスの先頭には大文字の名前を付ける必要があります。

関連する問題