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代码>赋值到实例初始值设定项块或构造函数中。某些子类的构造函数太多。但我是个白痴,我忘了初始化程序块可以是非静态的。非常感谢。