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

问题描述

我有一个带有 BaseClass xxx 属性public static StringBaseClass 构造函数需要调用一些具有 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";
}

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

  1. 如果 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
  1. 如果 BaseClass 构造函数也应该使用 ChildClass 重置的值,那么子类应该更新为:
class ChildClass extends BaseClass {
    static {
        xxx = "Bye";
    }

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

}

new ChildClass() 会输出:

Bye
Bye