public abstract class SuperClass {
public int x, y;
public static int z;
}
我希望每个SuperClass的子类都有静态变量z。当然,对于每个子类,z的值都将不同。我希望避免在每个子类中定义z,因为它将是值x和y的功能依赖关系。这种情况是否可行?
public abstract class SuperClass {
public int x, y;
public static int z;
}
我希望每个SuperClass的子类都有静态变量z。当然,对于每个子类,z的值都将不同。我希望避免在每个子类中定义z,因为它将是值x和y的功能依赖关系。这种情况是否可行?
SuperClass
的子类共享 SuperClass.z
,但不能按类别覆盖它。SuperClass
添加一个 static Map<Class,int> zs
,并提供可选的访问数据的函数。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);
}
}
public static int z = x
。无论我想要多少个子类,这种方法不会比你的建议增加任何代码行数,对吧? - user2651804z
。 - Sergey Kalinichenko可能最好的方法是在抽象类中添加一个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
}
Lexer
有public abstract String[] getTokenNames();
,子类有public static final String[] tokenNames = {...};
并实现该方法。 - Silly Freakpublic static z = 1
,那么为什么要写不必要的代码呢? - user2651804SuperClass sup; SubClass sub;
,以及一个访问 z
的非静态方法 SuperClass.foo()
。SuperClass
和 SubClass
都声明了 static int z;
。sup.foo();
和 sub.foo();
都将使用 SuperClass.z
,因为它们是静态绑定。你可能期望的行为是,所访问的 z
取决于对象的身份,而不是 foo()
所在的类。如果这就是你想要的,那么没问题,但一定要非常清楚地记录这个决定;否则可能会让其他开发人员感到困惑。 - Silly Freak如果我理解你的意思是这样的话,那么就执行
public abstract class SuperClass {
public int x, y, z;
public SuperClass(int z) {
this.z = z;
}
}
那么任何继承此类的类都会继承z;
static
变量属于声明它们的类。你能做的最好的事情就是隐藏它们。 - Sotirios Delimanolis