初始化时继承的 class 变量将覆盖由 parent 设置的自身值

Inherited class variables when initialized are overriding own value setted by parent

我的应用程序中有这样的东西:

public abstract class A {

    public A (){
        init();
    }
    
    protected abstract void init();
}

public class B extends A {

    private String strName = "";

    public B (){
        super();
    }
    
    @Override
    protected void init(){
        strName = "Hello";
    }
}

我正在创建 class B 的实例。应用是 运行 这个订单:

1-构造函数B,调用super

2- 构造函数 A,调用 init() 函数

3- B 中覆盖的 Init() 正在将“Hello”分配给 strName 变量

4-然后classB中的属性被初始化,当前值“Hello”被初始化值“”覆盖;

如果我想要许多 children 中的通用方法(如 init())在 parent 中调用,那么哪个结构是正确的?为了避免在每个 child 中重复它。并避免我遇到的问题。或者 parent 中的 init() 函数应该在 super.

下面的 child 构造函数中调用

你的问题是 super() 调用父构造函数,后者调用 init()。在 super() 调用之后,strName = ""; 语句在子 class 构造函数中 运行。

strName 应该是父 class 中的一个 protected 变量,如果你想这样设置的话。否则,您应该咬紧牙关,在调用 super(); 之后在构造函数中手动初始化它,这是最安全和最可预测的方法。