Java静态变量、继承和内存

Java静态变量、继承和内存,java,class,memory,static,subclass,Java,Class,Memory,Static,Subclass,我知道,如果我有同一个类的多个实例,所有这些实例都将共享相同的类变量,因此,无论我有多少个类实例,该类的静态属性都将使用固定的内存量 我的问题是: 如果我有几个子类从它们的超类继承了一些静态字段,它们是否共享类变量? 如果没有,那么确保它们共享相同的类变量的最佳实践/模式是什么 如果我有几个子类从它们的 超类,它们是否共享类变量? 是的,它们将在单个类加载器中在当前运行的应用程序中共享相同的类变量。例如,考虑下面给出的代码,这将使您对每个子类的类变量的共享有公平的想法。 class Super

我知道,如果我有同一个类的多个实例,所有这些实例都将共享相同的类变量,因此,无论我有多少个类实例,该类的静态属性都将使用固定的内存量

我的问题是: 如果我有几个子类从它们的超类继承了一些静态字段,它们是否共享类变量?

如果没有,那么确保它们共享相同的类变量的最佳实践/模式是什么

如果我有几个子类从它们的 超类,它们是否共享类变量?

是的,它们将在单个类加载器中在当前运行的应用程序中共享相同的类变量。
例如,考虑下面给出的代码,这将使您对每个子类的类变量的共享有公平的想法。

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概念

如果更改某个类中静态变量的值,则相同的更改值将复制到使用此变量的所有类中