【发布时间】:2018-12-24 19:46:44
【问题描述】:
我们有base 类如下:
public class Base {
protected static string rule = "test_1";
public static getRule(){
/* get rule value from origin class*/
}
}
我们有一些从base 类扩展而来的类。例如:
public class Derived extends Base {
static {
rule = "test_2";
}
}
现在我们想要获取规则变量,但是在某些情况下:
- 如果用户调用
Derived.getRule(),则返回test_2, - 如果在
derived类rule变量没有初始化,它返回test_1, - 我不想在所有子类中覆盖
getRule来回答问题。
我该怎么办?
【问题讨论】:
-
静态方法和字段不受覆盖。如果你的基类中有一个实例方法,你可以重写它以在派生类中返回不同的东西。但是如果你真的想直接在
Derived类上调用Derived.getRule(),你可以在Derived中定义一个静态方法getRule()。 -
在
Derived中定义一个名为getRule()的方法,它将getRule隐藏在base 中。但这似乎是一个普遍不明智的设计。 -
你不能使用静态,它们必须在非常具体的情况下使用,考虑你的模型
-
@azro 你能举个例子吗?
-
基本上,不要认为继承适用于静态的东西。您甚至可以创建一个完全不相关的类并创建一个从
Base获取rule的静态getter,以及一个从Base设置rule的setter。简而言之,extends这个词在这个上下文中的意思是nothing,只是继承类中的rule会自动指向直接超类中的rule,除非当前类中已经存在一个.
标签: java static-methods static-variables