2013-03-24 22 views
5

同じクラスのインスタンスが複数ある場合、それらのインスタンスはすべて同じクラス変数を共有するので、クラスの静的プロパティはどのように私が持っているクラスの多くのインスタンス。Java静的変数と継承とメモリ

私の質問は: スーパークラスからいくつかの静的フィールドを継承しているサブクラスが2つある場合、それらはクラス変数を共有するかどうかですか?

もしそうでなければ、同じクラス変数を共有するためのベストプラクティス/パターンは何ですか?私は彼らの スーパークラスからいくつかの静的フィールドを継承カップルのサブクラスを持っている場合は

答えて

15

、彼らはクラス変数を共有したりしないのだろうか?

はい現在、実行中のアプリケーション全体で同じクラス変数を単一のClassloaderで共有します。
例えば下記のコードを検討し、これは..あなたに同じ静的フィールド、そのクラスまたはサブクラスのシェアの

class Super 
{ 
    static int i = 90; 
    public static void setI(int in) 
    { 
     i = in; 
    } 
    public static int getI() 
    { 
     return i; 
    } 
} 
class Child1 extends Super{} 
class Child2 extends Super{} 
public class ChildTest 
{ 
    public static void main(String st[]) 
    { 
     System.out.println(Child1.getI()); 
     System.out.println(Child2.getI()); 
     Super.setI(189);//value of i is changed in super class 
     System.out.println(Child1.getI());//same change is reflected for Child1 i.e 189 
     System.out.println(Child2.getI());//same change is reflected for Child2 i.e 189 
    } 
} 
6

すべてのインスタンスをそのサブクラスの各々によるクラス変数の共有の公正なアイデアを与えるだろう指定されたクラスローダの場合

注:複数のクラスローダーで同じクラスを複数回ロードすると、各クラスローダーには静的フィールドのコピーがあります。

0

はいすべてのクラス階層(同じクラスとすべての子クラスインスタンス)は同じ静的変数を共有します。 JAVAはグローバル変数をサポートしていませんが、静的変数をOOPの概念に違反することなくグローバル変数として使用できます。

静的変数の値をクラスの1つから変更した場合、同じ変更された値がこの変数を使用するすべてのクラスに複製されます。