假设我有一个
public abstract class Super{
protected static int BASE = 1;
public int foo(){
//do some computation with BASE, e.g:
return BASE + 1;
}
}
以及从中继承的几个静态类:
public static abstract class Sub extends Super{
//this class should keep BASE at 1
}
static class SubSub1 extends Sub{
//this class should change BASE to 0
static{
SubSub1.BASE = 0;
}
}
static class SubSub2 extends Sub{
//this class should in effect have a BASE of 1
}
是的,这失败了。
问题显然是因为SubSub1是静态类,如果要更改BASE,Super.BASE必须是静态的。
但如果Super.BASE是静态的,那么SubSub1.Base就是Super.BASE。
我如何最好地实现我想要做的事情? (不,我不能使这些类非静态,并假设有很多子类。)
我很感激帮助。
答案 0 :(得分:0)
Java中没有静态类。除嵌套类外,所有Java类都是隐式静态的。接口,注释和枚举始终是静态的。
实际问题是另一个问题:Java中没有静态继承。子类不获取静态超类字段的副本,它获得相同的字段。无论您将其引用为SubSub.BASE还是作为Super.BASE都无关紧要,它都是Super.BASE
答案 1 :(得分:0)
实际上,“abstract protected int getBase()”并不是一个好主意 - 我只是不喜欢那个“抽象”部分,因为我必须在所有非抽象子类中实现它。
另一方面,这似乎正在起作用,并且只允许我在需要更改的地方更改BASE:
public abstract class Super{
protected int BASE = 1;
protected void setBase(){}
public int foo(){
setBase();
return BASE + 1;
}
}
然后:
public static abstract class Sub extends Super{
//this class should keep BASE at 1
}
static class SubSub1 extends Sub{
//this class should change BASE to 0
@Override
protected void setBase(){
BASE = 0;
}
}
static class SubSub2 extends Sub{
//this class should still have a BASE of 1
}
非常感谢,伙计们。