构造器递归调用

来源:互联网 发布:mac充电器如何使用 编辑:程序博客网 时间:2024/06/05 11:17
public class Constructor {    Constructor constructor = new Constructor();//    Constructor constructor ; // 1//    static Constructor constructor = new Constructor();//2    public Constructor() {        System.out.println("constructor");    }        public static void main(String[] args) {        Constructor c = new Constructor();    }}

上面程序就会发生递归调用。

首先明确,类初始化时实例变量将会在构造函数中初始化

main函数中声明局部变量c ,并对其初始化,这时程序会在堆空间里为其申请空间并完成对内存空间赋值


堆内存中c对象中constructor又回指向另一个Constructor的对象,于是

所以堆空间另一个constructor对象又要完成初始化,于是。。。

但是注释掉的两种变量声明不会引发递归。

对于1,在完成图1之后constructor对象指向null,对其赋值的方法只能是再次什么一个Constructor对象,付给它

对于2,类变量的初始化在类加载后程序对其初始化,因为类变量在程序中只会占用同一块空间,所以不会反复申请空间,也就不会递归了。

0 0