Java 和继承的静态成员

2022-09-02 03:51:34

假设我有以下类:

class Parent
{
    private int ID;
    private static int curID = 0;

    Parent()
    {
         ID = curID;
         curID++;
    }
}

和以下两个子类:

class Sub1 extends Parent
{
    //...
}

class Sub2 extends Parent
{
    //...
}

我的问题是,这两个子类共享来自父类的同一静态 curID 成员,而不是具有不同的子类。

所以如果我这样做:

{
    Sub1 r1 = new Sub1(), r2 = new Sub1(), r3 = new Sub1();
    Sub2 t1 = new Sub2(), t2 = new Sub2(), t3 = new Sub2();
}

r1,r2,r3 的 ID 将为 0,1,2,t1,t2,t3 的 ID 将为 3,4,5。而不是这些,我希望t1,t2,t3具有值0,1,2,即使用curID静态变量的另一个副本。

这可能吗?又是如何做到的呢?


答案 1

虽然字段/方法是继承的,但它们不能被重写,因为它们属于声明它们的类,而不是对象引用。如果您尝试覆盖其中一个,您将要做的就是隐藏它。static


答案 2

正如其他人已经写过的那样,静态成员绑定到类,所以你需要在类级别跟踪id,例如:

abstract class Parent {
    private int ID;

    Parent() {
         ID = nextId();
    }

    abstract protected int nextId();
}

class Sub1 extends Parent {
    private static int curID = 0;

    protected int nextId() {
       return curID++;
    }

    //...
}

class Sub2 extends Parent {
    private static int curID = 0;

    protected int nextId() {
       return curID++;
    }

    //...
}

请注意,此方法不是线程安全的 - 但问题中的代码也不是。不得从同一子类从不同的线程同时创建新对象。


推荐