同じクラスのインスタンスが複数ある場合、それらはすべて同じクラス変数を共有するため、クラスのインスタンスの数に関係なく、クラスの静的プロパティは固定量のメモリを使用します。
私の質問は次 のとおりです。スーパークラスから静的フィールドを継承するサブクラスがいくつかある場合、それらはクラス変数を共有しますか?
そうでない場合、それらが同じクラス変数を共有することを確認するためのベストプラクティス/パターンは何ですか?
スーパークラスから静的フィールドを継承するサブクラスがいくつかある場合、それらはクラス変数を共有しますか?
はいこれらは、単一のクラスローダーで現在実行中のアプリケーション全体で同じクラス変数を共有します。
たとえば、以下のコードを考えてみましょう。これにより、各サブクラスによるクラス変数の共有についての公正なアイデアが得られます。
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
}
}
そのクラスまたはサブクラスのすべてのインスタンスは、特定のクラスローダーに対して同じ静的フィールドを共有します。
注:同じクラスを複数のクラスローダーに複数回ロードする場合、各クラスローダーには独自の静的フィールドのコピーがあります。
はい、すべてのクラス階層(同じクラスとすべての子クラスインスタンス)が同じ静的変数を共有します。JAVAはグローバル変数をサポートしていませんが、OOPの概念に違反することなく、静的変数をグローバル変数として使用できます。
静的変数の値をクラスの1つから変更した場合、同じ変更された値がこの変数を使用するすべてのクラスに複製されます。