Java 构造时成员初始化的陷阱

Posted claireyuancy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 构造时成员初始化的陷阱相关的知识,希望对你有一定的参考价值。

1、首先列出代码

      Base.java

public class Base
{
    Base() {
        preProcess();
    }
 
    void preProcess() {}
}

      Derived.java

public class Derived extends Base
{
    public String whenAmISet = "set when declared";
 
    @Override void preProcess()
    {
        whenAmISet = "set in preProcess()";
    }
}

      Main.java

public class Main
{
    public static void main(String[] args)
    {
        Derived d = new Derived();
        System.out.println( d.whenAmISet );
    }
}

2、执行结果

技术分享


3、原因

      可參考http://blog.csdn.net/jltxgcy/article/details/17398751

      1、调用父类全局变量初始化,这里没有全局变量也不用初始化。

      2、调用父类构造函数,里面调用了子类的成员函数preProcess,whenAmISet被设置为"set in preProcess"

      3、调用子类全局变量初始化,whenAmISet被设置为"set when declared"。

      4、调用子类的构造函数。


4、番外

     假设全局变量whenAmISet,没有设置初始化值。那么会设置为默认值。

对象为null,int为0。

     局部变量。不会设置初始化值。须要显示设置,不能直接使用。

      C++构造函数初始化列表必需要显示初始化參数。

和Java不同。







以上是关于Java 构造时成员初始化的陷阱的主要内容,如果未能解决你的问题,请参考以下文章

Java类的各种成员初始化顺序如:父子类继承时的静态代码块,普通代码块,静态方法,构造方法,等先后顺

java中成员变量代码块构造函数运行顺序

java中的一些执行顺序,代码块,静态,构造,成员。。。。(转的)

java 对象的初始化流程(静态成员静态代码块普通代码块构造方法)

java类创建时里面成员执行的先后顺序

Java代码块