2017-06-17 4 views
-2
class ABC { 
    int x; 
    static ABC y = new ABC(); 
} 


public class XYZ { 

    public static void main(String[] args) { 
     ABC q = new ABC(); 
     q.x = 5; 
     System.out.println(q.x); 
    } 

} 

誰かが、コードの実行時に何が起こるか(ステップバイステップ)を説明できますか?独自の型の静的メンバーを持つクラス

また、staticキーワードがインスタンスyより前に削除された場合、StackOverflowエラーが発生します。 staticキーワードが存在すると、これはなぜ発生しませんか?

ありがとうございます。

+0

あなたの宿題ですか、このコードを正確に理解できないのですか? –

+2

'static'を削除すると、' ABC'インスタンスにはそれ自身の 'y'フィールドがあります。つまり、作成されたすべての' ABC'インスタンスに対して 'y'値に新しい' ABC'インスタンスが必要です。新しい 'y'値を必要とする新しい' ABC'インスタンスを作成します。新しい 'y'値を必要とする新しい' ABC'インスタンスを作成しますので、新しい 'ABC'インスタンスを作成します。新しい 'y'値を必要とするので、新しい' y'値を必要とする新しい 'ABC'インスタンスを作成します。新しい' y'値を必要とする新しい 'ABC'インスタンスを作成します。' StackOverflowError' !!! – Andreas

+1

これは、SingleTonパターンを不適切に使用しようとするようなものです:p – WilomGfx

答えて

1

staticは、変数の1つのインスタンスが複数の参照オブジェクト(この場合はy)にわたって使用されることを意味します。

staticフィールドはclassのコンテキスト内に存在します。つまり、クラスのすべてのインスタンスが同じstaticオブジェクトインスタンスを指していることを意味します。シナリオで :

ABC a = new ABC(); 
ABC b = new ABC(); 
System.out.println(a.y==b.y); 

プリントtrueをもたらすであろう、なぜならaと同じオブジェクトにbポイントの両方でyのインスタンス。

非静的フィールドには、独立した個々のインスタンスが設定されます。シナリオであることを意味:a.yないb.yと同じインスタンスになるので(そのようなものがStackOverflowのを誘発しないであろう仮定のシナリオで)

ABC a = new ABC(); 
ABC b = new ABC(); 
System.out.println(a.y==b.y); 

falseをもたらすであろう。それぞれyフィールドにそれぞれABCという独自のインスタンスがあります。

ABCはインスタンス化されるとき、それは、インスタンス化したときに、別のABCを作成し、その上、無限に(スタックがオーバーフローするまで)yフィールド、だため、それは別のABCのインスタンスを必要とするためStackOverflowstaticキーワードを指定せずに発生します。

staticでは、ABCの1つの静的インスタンスであるsABCが作成され、それ自身のyフィールドがそれ自体を参照するだけなので、インスタンス化の無限ループは起こりません。

+0

ありがとうございました。また、オブジェクト 'q'がどのように見えるか教えてください。オブジェクトに' y'があるのか​​、整数 'x'しかないのでしょうか? –

+0

'ABC'のすべてのインスタンスに' y'フィールドがあります。違いは、その 'y'オブジェクトが指しているものにあります。 'q'(メインで作成したインスタンス)では、' y'を指します(静的な2番目のインスタンスです。これは、静的なABC y =新しいABC();のためにインスタンス化されます) 'ABC'クラスの定義です。)...' y'(インスタンス)では、 'y'(フィールド)が' y'(インスタンス)を指しています。 'y'が静的でない場合、' y'インスタンスは 'y'フィールドに新しいインスタンスを設定します。それはそれ自身の内部' y'フィールドのために別のインスタンスを必要とします。 on ... – XenoRo

+0

@AayushTaneja私はあなたのために物事をより明確にしようとする答えを編集しました。それでも理解できない場合は、OOPの基本を読むことを強くお勧めします。 – XenoRo

0

このクラスをロードすると、すぐにこのクラスのインスタンスが作成され、クラス変数yに割り当てられます。これは、yが静的であると宣言されているためです。 もしあなたがy staticを宣言していなければ、クラスABCの全てのインスタンスが属性yを持ち、これもABCであると言っています。また、y属性にクラスABCの新しいインスタンスを割り当てる必要があると言っているので、main()の最初のステートメントのように、ABCのインスタンスを明示的に作成するたびにこのインスタンスが作成されます。あなたは再帰を見つけますか?スタックオーバーフローが発生します。

+0

ありがとうございました。 –

0

静的変数は、クラスレベルの変数です。

インスタンス変数は、オブジェクトレベルの変数です。

staticキーワードを削除すると、このクラスはインスタンス化を試み、無限ループが発生しますが、静的変数は1つのインスタンスを1回作成し、すべてのオブジェクト間で共有されます。

スタックメモリはローカル変数と関数呼び出しを保持しているため、無限呼び出しがあるためオーバーフローします。

+0

ありがとうございます。 –

0

チュートリアル

ABC q = new ABC(); 

5

System.out.println(q.x); 

ぷりにプロパティxqq

q.x = 5; 

セットと呼ばれるABCクラスの新しいインスタンスを作成します。 qのプロパティxが保持する値をNTが

staticキーワード手段

静的(5なければならない)同じ可変クラスの株式のすべてのインスタンス。クラスABCのインスタンスを作成すると、変数yとしてABCという別のインスタンスが含まれます。 ABCの別のインスタンスを作成すると、変数yもありますが、その変数はABCの最初のインスタンスが保持するyと同じです。

staticキーワードを削除する場合は、ABCの各インスタンスでyを共有しません。 ABCのインスタンスを作成すると、yが作成され、yyというように作成され、メモリが不足してStackOverflowエラーが発生するまで続きます。

+0

ありがとうございました。 –

関連する問題