定义变量的时候赋初始值和不赋初始值是有区别的
程序员文章站
2022-07-16 17:57:36
...
最近在做项目的时候又遇到一个问题,耗了自己一点时间,终于搞清楚问题在哪里,得出的结论是-基础知识很重要。记录下来,以提醒自己。
代码如下:
public abstract class Parent {
public Parent() {
initGlobalVariables();
}
public abstract void initGlobalVariables();
}
public class Child extends Parent {
private String child = "";
public Child() {
super();
System.out.println("Child构造方法 child = " + child);
}
@Override
public void initGlobalVariables() {
child = "child";
System.out.println("initGlobalVariables child = " + child);
}
}
public static void main(String[] args) throws Exception {
Parent child = new Child();
}
输出如下:
initGlobalVariables child = child
Child构造方法 child =
问题原因在于:本来预期能够能够输出child的值能够是"child",但是打印出来的child的值一直是""。好吧,我就查呀查呀,理清了java类创建的顺序,结合String的不变性终于搞清楚了原因。整理知识点如下:
当有继承关系时,类在加载的时候如下:
加载父类的构造方法-> 加载子类的成员变量->加载子类的构造方法。所以该代码首先加载父类Parent 的构造方法,调用到子类的initGlobalVariables方法,对子类的child进行赋值。此时得到的child的值为child,然后在加载子类的成员变量的时候,又进行了对该child的赋值,所以导致了child变为了"",此时在子类输出child的值的时候,为""。
如果想实现child的值在Child类的构造函数输出child,怎么办呢?当然其实很简单了,只要在定义child的成员变量的时候不赋值即可。
因为String的不变性,所以在父类Parent调用到子类的initGlobalVariables方法,对子类的child进行赋值之后,child变量的值不在发生变化,此时在调用到子类的构造方法的输出函数之后,该值即为child。
当时为了代码的安全性给child附了初始值,没想到引出这点小差错。好吧,基础知识很重要。把这些东西敲出来提醒自己要不断去学习,不断去查缺补漏
上一篇: java.lang.Class类