我的子类如何正确地继承静态变量

时间:2014-03-17 17:08:15

标签: java inheritance static superclass

public abstract class SuperClass {
    public int x, y;
    public static int z;
}

我希望SuperClass的每个子类都有静态变量z。自然地,z将为每个子类包含不同的值。我希望避免在每个子类中定义z,因为它将成为值x和y的函数依赖;这可能吗?

3 个答案:

答案 0 :(得分:3)

与实例变量不同,每个实例一个",static变量不是"每个子类一个" - 他们是#34;每个宣布课程#34;换句话说,SuperClass的子类共享SuperClass.z,但他们不能"覆盖"它是逐类的。

这并不意味着您无法自己实现它:在创建自己的每个子类存储整数的过程中,添加static Map<Class,int> zsSuperClass,其中包含用于访问数据的可选函数: / p>

public abstract class SuperClass {
    public int x, y;
    private static Map<Class,Integer> zs = new HashMap<Class,Integer>();
    protected static int getZ(Class c) {
        Integer res = zs.get(c);
        return res == null ? -1 : res.intValue();
    }
    protected static void setZ(Class c, int v) {
        zs.put(c, v);
    }
}
class SubClassOne extends SuperClass {
    public int getZ() {
        return SuperClass.getZ(SubClassOne.class);
    }
}
class SubClassTwo extends SuperClass {
    public int getZ() {
        return SuperClass.getZ(SubClassTwo.class);
    }
}

答案 1 :(得分:3)

执行此操作的最佳方法可能是在抽象类中使用z()方法或类似方法,并覆盖所需子类中的方法。

示例:

public abstract class SuperClass {
  public int x, y;

  protected int z() {
     return 42; // protected so only subclasses can see it - change if required
  }
}


public class SubClassOne extends SuperClass {

  public void foo() {
    // do something...
    int z = z();
    // something else...
  }
}

public class SubClassTwo extends SuperClass {

  @Override
  protected int z() {
    return 1;
  }

  // use z() accordingly
}

答案 2 :(得分:0)

如果我理解正确,那么

public abstract class SuperClass {

  public int x, y, z;
  public SuperClass(int z) {

    this.z = z;

  }

}   

然后任何扩展此类的类都会继承z;