静态类中的受保护整数

时间:2014-10-05 19:08:46

标签: java class inheritance static primitive

假设我有一个

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。

我如何最好地实现我想要做的事情? (不,我不能使这些类非静态,并假设有很多子类。)

我很感激帮助。

2 个答案:

答案 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
}

非常感谢,伙计们。