JAVA从基类继承静态字段的方式不同于每个子类
我有一个基础班JAVA从基类继承静态字段的方式不同于每个子类,java,inheritance,static,field,Java,Inheritance,Static,Field,我有一个基础班 public class base { //some stuff } 和几个子类 public class sub1 extends base { static int variable; } public class sub2 extends base { static int variable; } 等 静态int变量存在于每个子类中,因为我在其中存储了每个子类特有的信息。但是,如果有一种方法可以将静态int变量移动到基类,使每个子类的int变量仍然不同,那就更好
public class base
{
//some stuff
}
和几个子类
public class sub1 extends base
{
static int variable;
}
public class sub2 extends base
{
static int variable;
}
等
静态int变量存在于每个子类中,因为我在其中存储了每个子类特有的信息。但是,如果有一种方法可以将静态int变量移动到基类,使每个子类的int变量仍然不同,那就更好了。
正如我现在重复的那样,当添加另一个子类时,这是一种糟糕的做法
那么有人知道如何完成这个吗?也许有一种设计模式适合这种情况?您不能将所有不同的静态变量从派生类移动到基类中,因为每个类都有一个静态变量;您希望每个子类有一个变量,这是不允许的 您可以通过在基类中定义子类的注册表来解决这个问题,并为每个子类存储
int
。然而,这将增加更多的复杂性,并且不清楚如何区分超类中的子类
您当前的解决方案似乎是最优的。您当然可以将变量移动到基类中,但它不能是静态的。或者,您可以创建静态getter,在每个子类中重写它。以下是两者的一个示例:
public class base {
protected int variable;
protected static int getVariable() {
return -1;
}
}
public class Sub1 extends base {
public Base() {
variable = 0;
}
protected static int getVariable() {
return 0;
}
}
public class Sub2 extends base {
public Sub2() {
variable = 1;
}
protected static int getVariable() {
return 1;
}
}
作为一种设计原则,很少(在我看来)真正需要静态方法。通常,您将有一些您正在使用的类的实例。如果您想让一大堆对象共享运行时配置的一些常见行为,您可能需要查看flyweight模式。不要为此使用静态字段-这不是办法,因为子类的静态字段不会“覆盖”超类的静态字段 相反,由于给定类的值是常量,请使用最终实例字段:
public class Base {
protected final int variable;
public Base() {
this(5);
}
protected Base(int v) {
variable = v;
}
}
public class Sub1 extends Base {
private static int v = 7;
public Sub1() {
super(v);
}
}
现在,该变量是固定的,所有实例都可以访问。如果值不同,您如何重复自己的操作?给定子类的值是否会随时间变化,或者它是常量?@Bohemian它不是。@BartlomiejLewandowski当我创建sub1的两个对象时,我希望它们具有相同的变量值,但不同于sub2对象,例如:
sub1 obj1=new sub1();//value=x sub1 obj2=new sub1();//value=x sub2 obj3=new sub2()//value=y sub2 obj4=new sub2()//value=y
现在假设我有5个使用静态变量的方法,我必须在每个子类中实现它们,但它们都是相同的-这就是重复myselfJava不允许重写静态方法。你所建议的只是一个简单的重新定义。将调用哪种方法是根据引用变量的类型在编译时确定的。例如:base b=new Sub2();b、 getVariable()
将返回-1
。如果静态getter方法返回一个常量,而不管变量包含什么,那么获取变量的意义何在?这与方法返回的内容无关,而是与调用哪个静态方法有关。如果在代码中使用引用变量(base b;b.getVariable()
)调用静态方法,则该引用变量的类型决定调用哪个方法。如果在代码中使用类(Sub2.getVariable()
)调用静态方法,则将调用该类中定义的方法。请尝试运行代码。我向您保证,您可以实例化一个新的Sub1(),getVariable()将返回1。不过,您是对的,如果您将其大小写为Base,它将不再返回1。new Sub1()。getVariable()
将返回1
——因为new Sub1()
返回类型为Sub1
的“不可见”参考变量。但是base b=new Sub1();b、 getVariable()
将返回-1
-因为引用变量b
的类型是base
(虽然它引用的对象的类型是Sub1
)是的,但问题是我发布的示例简化了ofc,而在实际代码中变量是object(我指的某种大对象)而且在应用程序运行期间会产生大量的子类对象,因此使其成为非静态(为同一子类的每个对象生成新变量)将影响性能。@Rotek请参阅更改为子类以避免重新创建值。此外,如果基本没有直接使用,请考虑使它<代码>抽象<代码>,并删除默认构造函数。