Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JAVA从基类继承静态字段的方式不同于每个子类_Java_Inheritance_Static_Field - Fatal编程技术网

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请参阅更改为子类以避免重新创建值。此外,如果基本没有直接使用,请考虑使它<代码>抽象<代码>,并删除默认构造函数。