Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.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_Static Methods_Static Variables - Fatal编程技术网

如何在Java中使用静态扩展变量?

如何在Java中使用静态扩展变量?,java,static-methods,static-variables,Java,Static Methods,Static Variables,我们有如下base类: public class Base { protected static string rule = "test_1"; public static getRule(){ /* get rule value from origin class*/ } } 我们有一些从baseclass扩展而来的类。例如: public class Derived extends Base { static { rule =

我们有如下
base
类:

public class Base {
    protected static string rule = "test_1";

    public static getRule(){
    /* get rule value from origin class*/
    }
}
我们有一些从
base
class扩展而来的类。例如:

public class Derived extends Base {
     static {
          rule = "test_2";
     }
}
现在我们想要得到规则变量,但在某些情况下:

  • 如果用户调用
    Derived.getRule()
    ,它将返回
    test\u 2
  • 如果在
    派生的
    规则
    变量not init中,它返回
    测试1
  • 我不想覆盖所有子类中的
    getRule
    来回答这个问题

我该怎么办?

问题是,一旦使用了
派生的
类(初始化),
基本规则
被更改,现在无论实际的类是什么,都会返回
测试2

因此,该技术必须在没有静态(以该形式)的情况下完成。有一个分类的类级别值

public class Base {
    private static final String BASE_RULE = "test_1";

    public String getRule() {
        return BASE_RULE;
    }
}

public class Derived extends Base {
    private static final String DERIVED_RULE = "test_2";

    @Override
    public String getRule() {
        return DERIVED_RULE;
    }
}
或者,您也可以使用标记接口,但它们不是互斥的,因此不适用于某些getCategory()


静态方法和字段不受重写的约束。如果基类中有实例方法,则可以重写它以在派生类中返回不同的内容。但是,如果您确实想直接在
派生的
类上调用
派生的.getRule()
,您可以在
派生的
中定义一个静态方法
getRule()
。在
派生的
中定义一个名为
getRule()
的方法,该方法在base中隐藏
getRule
。但这似乎是一个总体上不明智的设计。您可能不使用静态,它们必须在非常特定的情况下使用,请考虑您的model@azro你能举个例子吗?基本上,不要认为继承适用于静态的东西。您甚至可以创建一个完全不相关的类,创建一个从
Base
获取
规则的静态getter,以及一个从
Base
设置
规则的setter。简言之,单词
extensed
在此上下文中没有任何意义,除非继承类中的
规则
自动指向直接超类中的
规则
,除非当前类中已经有一个规则。
public class Base implements Test1Category {
}

public class Derived extends Base implements Test2Category { ... }

if (base instanceof Test2Category) { ... }