问题描述
我有一个带有 BaseClass
xxx 属性的 public static String
。 BaseClass
构造函数需要调用一些具有 xxx 属性的方法。并且有一个 ChildClass
应该重写 BaseClass
xxx 属性,但如果我在 ChildClass
构造函数中这样做为时已晚。
如何更改 BaseClass
xxx 属性以便 BaseClass
构造函数将使用来自 ChildClass
xxx 的值?
BaseClass {
public statis Strin xxx = "";
public void BaseClass()
{
open(xxx);
}
}
ChildClass extends Baseclass {
// Need to rewrite this value to be used by BaseClass constructor
public statis String xxx = "something else"
}
BaseClass
仍然使用它自己的值,而不是构造函数中 ChildClass
的值。
解决方法
您可能不想更改基类使用的值。
静态字段不能被覆盖。您可以使用非静态字段来实现,并将静态字段保留为默认值,如下所示:
class BaseClass {
public static String DEFAULT_XXX = "";
protected final String xxx;
public BaseClass()
{
this(DEFAULT_XXX);
}
protected BaseClass(String xxx)
{
this.xxx = xxx;
open(xxx);
}
}
class ChildClass extends BaseClass {
public ChildClass()
{
super("something else");
}
}
,
可以使用子类中的 static
块。
static {
xxx = "something else";
}
这将在构造函数之前调用。
- 如果 BaseClass 构造函数需要使用类内部声明的值:
class BaseClass {
public statis Strin xxx = "Hello";
public BaseClass()
{
System.out.println(xxx);
}
}
class ChildClass extends BaseClass {
{
xxx = "Bye";
}
public ChildClass(){
System.out.println(xxx);
}
}
new ChildClass()
会输出
Hello
Bye
- 如果 BaseClass 构造函数也应该使用 ChildClass 重置的值,那么子类应该更新为:
class ChildClass extends BaseClass {
static {
xxx = "Bye";
}
public ChildClass(){
System.out.println(xxx);
}
}
new ChildClass()
会输出:
Bye
Bye