public abstract class SuperClass {
public int x, y;
public static int z;
}
我希望SuperClass的每个子类都有静态变量z。自然地,z将为每个子类包含不同的值。我希望避免在每个子类中定义z,因为它将成为值x和y的函数依赖;这可能吗?
答案 0 :(得分:3)
与实例变量不同,每个实例一个",static
变量不是"每个子类一个" - 他们是#34;每个宣布课程#34;换句话说,SuperClass
的子类共享SuperClass.z
,但他们不能"覆盖"它是逐类的。
这并不意味着您无法自己实现它:在创建自己的每个子类存储整数的过程中,添加static Map<Class,int> zs
到SuperClass
,其中包含用于访问数据的可选函数: / 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;