初始化时继承的 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();
之后在构造函数中手动初始化它,这是最安全和最可预测的方法。
我的应用程序中有这样的东西:
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();
之后在构造函数中手动初始化它,这是最安全和最可预测的方法。