破坏单例模式之静态方法、静态代码块和构造方法执行顺序

本文探讨了如何利用静态代码块破坏单例模式,并分析了其背后的原理。通过具体的Java代码示例,展示了静态代码块的执行顺序及其对单例模式的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

昨天看了凯子哥的单例设计模式,里面讲到了破坏单例模式的方法,具体内容请看原文,这里来分析一下原理。为什么通过静态代码块就会破坏单例模式呢,这就是今天要讲的故事:静态代码块在什么时候执行?
上代码

class Parent {
    {
        System.out.println("i am parent block");
    }
    static {
        System.out.println("i am parent static block");
    }
    public Parent() {
        System.out.println("i am parent constructor");
    }
}
class Child extends Parent {
    {
        System.out.println("i am child block");
    }
    static {
        System.out.println("i am child static block");
    }
    public Child() {
        System.out.println("i am child constructor");
    }
}

这个时候new Child(),会发生什么?

i am parent static block
i am child static block
i am parent block
i am parent constructor
i am child block
i am child constructor

从上面的打印结果来看,static block的优先级最高,先执行父类的static block->执行子类的static block->父类普通block->父类的constructor->子类普通block->子类constructor


这就是为什么当在静态代码块里面去new对象的时候,会破坏单例模式,因为静态代码块是主动执行的,当加载到的这个class文件内有静态代码块,那么静态代码块会先去执行,静态代码块里面初始化了一次,手动调用的时候又初始化了一次。
如果是静态内部类实现的单例模式,这种破坏方法不起作用,静态内部类只会执行一次,当SingletonDestyoyer中的静态代码块去调用SingletonStatic.getInstance()的时候,静态内部类还没有初始化完成,返回null,不会出现多次初始化的情况。
Ps:这块还是有点迷糊,如果有明白人,欢迎交流!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值