2012-05-02 20 views
0

サブクラスを呼び出すメインクラスがあります。サブクラス変数が再び初期化されない

私のサブクラスが

メインのように私はそれは を初期化し、私がメインでsubclass2の新しいオブジェクトを作る際に毎回たいSubClass2.Iのオブジェクトを呼び出す
public class SubClass2 extends Main { 


    public static long a = 0; 
    public static long b = 0; 
    public static long c= 0; 

    public void Analyze(int number) 
    { 
     b=2; 

    //some code 
    } 
    } 

のようないくつかのpublic static変数が含まれていますすべての変数= 0ですが、変数b.Itのprintステートメントを取ると、4.Itは前の値と新しい値を加算します。

enter image description here

+0

静的メソッドまたは変数は、特定のオブジェクトにではなく、クラス全体に関連付けられます。クラスがロードされるときに割り当てられます。あなたがインスタンスを呼び出すたびに、変数の新しい値が提供されることを覚えておいてください。 –

答えて

6

あなたのフィールドは、その場合のstaticとして宣言すべきではありません。これが毎回初期化されていない理由です。 A staticフィールドは一度だけ初期化され、クラスのすべてのインスタンスによって共有され、アクセシビリティに応じて、クラスの外部でも共有されます。

4につながったロジックは、//some codeに置き換えられたコードに含まれていなければなりませんが、ここでは本当に関係ありません。

インスタンスがインスタンス化されるたびに初期化されるこれらのフィールドは、実際にはstaticフィールドである必要がある場合は、クラスのコンストラクタで手動で初期化する必要があります。しかし、私は真剣にこのような状況につながるデザインに疑問を呈します...

+0

それでは、異なるクラスでそれらの変数にアクセスし、それらを再起動する必要があるときに再度初期化したい場合は、私のプロジェクト – Xara

+0

"は"それを誇張しているはずです。あなたは、このクラスのインスタンスが1つしかないということをあなたが「私のプロジェクトを再開する」と言い張っていますか?その場合、事実上静的なクラスではないはずです。つまり、 'Analyze'も静的ではないでしょうか?複数のインスタンスがある場合でも、静的コンテキストではなく、インスタンス変数でこれらのフィールドにアクセスできます(または 'getA'や' getB'メソッドなどを公開することでより効果的です)。 –

+0

プロジェクトを再開すると、このサブクラスのインスタンスは1つだけになります。私はサブクラスのメソッドを静的にする必要があると言っていますか? – Xara

4

あなたは静的変数を使用しています。これらは、あなたが作成するオブジェクトには接続していません。それらは単なるグローバルでユニークな変数です。 staticを消去する必要があります。ところで、フィールドを0に初期化することは冗長です。既にゼロに初期化されています。

+0

「グローバル」? 「ユニーク」?どういう意味? –

+0

Cのグローバル変数のように - どこからでも見ることができ、シングルトンのようにユニークです。単一のメモリロケーション。あなたは彼らが「クラスのすべてのインスタンスで共有されている」と言っていますが、それはせいぜい誤解を招くだけです。それらは、JVM全体(または、より正確には、クラスをロードしたClassLoader)によって共有されます。 –

+0

私はこれらの変数をa、b、cのいくつかのクラスにもアクセスしています。そのため、私はそれらを静的にしました。他のクラスでも同様にアクセスできます。 – Xara

1

staticという単語を使用すると、それを使用して作成されたすべてのものの間で共有される変数のインスタンスが1つだけになります。静的メソッドを削除し、メソッドで初期化されるたびに、新しい、しかしもっと重要なことに、個々の変数があります。

もっと良い言い回しは、インスタンスメソッドが共有変数と静的変数にアクセスできることです。

1

あなたの質問には矛盾があります。静的変数は、クラスがロードされると一度初期化されます。インスタンスごとに変数を初期化する場合は、インスタンス単位(静的でない)の変数を使用します。

関連する問題