初始化时继承的类变量会覆盖父级设置的自己的值

low*_*all 1 java inheritance android constructor 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";
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在创建 B 类的实例。该应用程序正在运行以下命令:

1- 构造函数 B,调用 super

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

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

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

如果我想在父级调用 init() 等许多子级中的通用方法,这是正确的结构。避免在每个孩子身上重复。并避免我遇到的问题。或者,父级中的 init() 函数应该在 super 下的子构造函数中调用。

Mik*_*sen 5

这里的问题是super()调用父构造函数,它调用 init()。该strName = "";语句然后在super()调用后在子类构造函数中运行。

strNameprotected如果你想这样设置它应该是父类中的一个变量。否则,您应该硬着头皮在调用后在构造函数中手动初始化它。super();这是最安全和最可预测的方法。

  • 是的。大多数情况下,拥有受保护的字段:不是一个好的设计。因此,最好将字段保留在子类中,并将它们设为最终的,然后在构造函数中初始化它们。 (2认同)