Java 静态类中的受保护整数

Java 静态类中的受保护整数,java,class,inheritance,static,primitive,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 cl

假设我有一个

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

我如何才能最好地实现我正在努力做的事情?(不,我不能使类成为非静态的,并且假设有很多子类。)


非常感谢您的帮助。

Java中没有静态类。除嵌套类外,所有Java类都是隐式静态的。接口、注释和枚举始终是静态的

实际问题与此不同:Java中没有静态继承。子类不获取静态超类字段的副本,而是获取相同的字段。不管你是将它引用为SubSub.BASE还是Super.BASE都无所谓,它是Super.BASE

事实上,“抽象保护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
}

非常感谢,伙计们。

你们想要实现什么?你为什么这么做?我不认为静态类是你想象的那样。默认情况下,任何外部类都是静态的。静态仅适用于嵌套类,其中包含对外部类的引用,除非是静态的。静态类并不意味着其所有变量都需要是静态的。使
BASE
成为非静态的。(另外,默认情况下,所有caps变量名称都暗示一个常量,但实际上并非如此——您应该将变量命名为
base
)。或者,您可以在基类中创建一个受
抽象保护的int-getBase()
方法,然后让子类实现它。所有的子类都可以访问相同的静态字段。记住,“静态”意味着“单个实例”。根据定义,如果希望变量“BASE”根据其上下文具有不同的值,则意味着它不是静态的。只需将其声明为非静态变量,就可以实现您想要的功能。“Java中没有静态类。所有类都是隐式静态的”您不需要
setBase()
方法。您可以简单地将
BASE=0赋值到实例初始值设定项块或构造函数中。某些子类的构造函数太多。但我是个白痴,我忘了初始化程序块可以是非静态的。非常感谢。