欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

定义变量的时候赋初始值和不赋初始值是有区别的

程序员文章站 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附了初始值,没想到引出这点小差错。好吧,基础知识很重要。把这些东西敲出来提醒自己要不断去学习,不断去查缺补漏