当前位置: 首页 > 知识库问答 >
问题:

Java和继承的静态成员[重复]

赫连靖琪
2023-03-14

假设我有以下课程:

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静态变量。

这有可能吗?怎么做?

共有3个答案

宋伟泽
2023-03-14

这是可能的,但不使用单个计数器。每个子类型都需要一个计数器。例如,如下所示:

private static Map<Class<?>, Integer> counters = new HashMap<>();

Parent() {
     Integer curID = counters.get(this.getClass());
     if (curID == null) {
         curID = 0;
     }
     ID = curID;
     curID++;
     counters.put(this.getClass(), curID);
}

注意:以上内容不是线程安全的。但是你的初始代码也不是...

有宏峻
2023-03-14

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

潘畅
2023-03-14

正如其他人已经写过的,静态成员绑定到类,所以您需要在类级别上跟踪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++;
    }

    //...
}

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

 类似资料:
  • 问题内容: 假设我有以下课程: 以及这两个子类: 和 我的问题是这两个子类从父类共享相同的静态curID成员,而不是拥有不同的成员。 所以,如果我这样做: r1,r2,r3的ID为0,1,2,而t1,t2,t3的ID为3,4,5。除了这些,我希望t1,t2,t3的值分别为0、1、2,即使用curID静态变量的另一个副本。 这可能吗?如何? 问题答案: 正如其他人已经写过的,静态成员已绑定到该类,因

  • 我正在用Java建模,并使用构建器模式。在许多情况下,一些共同成员是在父级中定义的,而其他成员则是在从父级继承的子级上定义的。一个例子如下: 如果删除,则在上得到相同的错误。看来我对静态嵌套类的继承有一个根本的误解。 为什么当返回时,编译器会抱怨方法不在中?有没有一种方法可以像我所尝试的那样,利用继承和这个构建器模式,允许在父级中定义公共成员,在子级中定义其他成员?

  • 问题内容: 我不太明白为什么可以在Java中继承静态方法? 继承就像从基类继承,而Static属于Class而不是Object。 那么,如果静态仅属于该类,为什么它会滴入派生类呢?它不应该只与定义它的类一起使用吗? 继承静态方法是一种好的编程习惯吗? 问题答案: 在Java中,静态方法不是 继承的 (或正确的词被 覆盖 ),但可以 隐藏 。 这里最大的不同是它们不像对象方法那样经受多态性。 运行时

  • 问题内容: 有人告诉我,对于Java子类,它可以继承其超类的所有成员。那么这是否意味着甚至私人成员?我知道它可以继承受保护的成员。 谁可以给我解释一下这个。我现在很困惑。 问题答案: 不,私有成员 不会被继承, 因为私有成员的范围 仅限 于定义它的类。仅公共成员和受保护成员被继承。 从, 超类私人成员 子类 不继承 其父类 的私有成员 。但是,如果超类具有用于访问其私有字段的公共或受保护的方法,则

  • 问题内容: 我想要以下设置: 这在Java中可能吗?怎么样?如果可以避免的话,我宁愿不使用实例变量/方法。 谢谢! 编辑: 常量是数据库表的名称。每个子对象都是一个微型ORM。 问题答案: 您无法完全按照自己的意愿去做。也许可以接受的折衷方案是:

  • 问题内容: 这是我遇到的一个测试练习问题,希望您能帮助我理解概念 让Hawk成为Bird的子类。假设某个类有两个重载的方法void foo(Hawk h)和void foo(Bird b)。在声明Bird x = new Hawk()之后,将在调用foo(x)中执行哪个版本; 这是我到目前为止的代码,有人可以向我解释为什么foo(bird b)被执行吗? 问题答案: Java执行重载解析以选择方法