如何在调用父构造函数之前覆盖子 class 中的父 class 属性?

How to overwrite parent class property in child class before parent constructor is called?

我有一个 BaseClasspublic static String xxx 属性。 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 的值。

可以使用 child class 中的 static 块。

static {
    xxx = "something else";
}

这将在构造函数之前调用。

  1. 如果BaseClass构造器需要使用class里面声明的值:
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
  1. 如果 BaseClass 构造函数也应使用 ChildClass 重置的值,则 child class 应更新为:
class ChildClass extends BaseClass {
    static {
        xxx = "Bye";
    }

    public ChildClass(){
        System.out.println(xxx);        
    }

}

new ChildClass() 会输出:

Bye
Bye

您可能不想更改基类使用的值。

无法覆盖静态字段。您可以使用非静态字段来实现,并将静态字段保留为默认值,如下所示:

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");
    }

}