Java中环形依赖

1、成员变量初始化时环形依赖

Java会将所有初始化动作集中到<init>()方法中,第一步是调用父类的<init>(),然后是初始化成员变量,最后是调用构造方法的初始化逻辑。这里很明显造成了<init>()的死循环,在执行A.<init>()时,里面有一个B需要初始化,然后去执行B.<init>,发现B中有A,然后去执行A.<init>,然后发现B需要初始化......,就这样形成了死循环。这不是语言的设计缺陷,而是代码的设计缺陷,我们应该避免这样的代码。

public class A {

    private B b = new B();
}

public class B {

    A a = new A();
}

public class CircularReference {

    public static void main(String[] args) {
        A a = new A();
    }

}

输出:

 2、静态成员变量环形依赖

当把其中一个变量设置为static变量时,就可以终止这个环形依赖,静态变量的初始化不在<init>()中,而是在类加载的时候就做了,这个过程早于<init>,所以,这里在加载B时,发现A,然后去加载A并实例化,初始化A实例时发现B,就去初始化B实例,此时是能初始化B的,因为B的<init>中没有初始化A的动作,所以可以顺利初始化B实例,进而A实例顺利初始化。

public class A {

    private B b = new B();
}

public class B {

    static A a = new A();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值