首页 新闻 会员 周边 捐助

单例设计为什么调用方法时只能创建一个对象

0
[已解决问题] 解决于 2023-12-20 21:38



为什么在测试类中重复调用getS方法却只能创建一个对象,请各位大佬解答

戈壁老王-的主页 戈壁老王- | 初学一级 | 园豆:159
提问于:2023-12-02 22:58
< >
分享
最佳答案
1

static修饰的对象在类加载时已经创建好了,该类所有的实例共享类变量。所以单例模式创建的实例最好是无状态的,不然在多线程,多个实例操作同一个单例对象会有并发问题。

奖励园豆:5
此木|西贝 | 菜鸟二级 |园豆:420 | 2023-12-05 22:27

所以static修饰的东西会在加载类的时候就加载好是吗?

戈壁老王- | 园豆:159 (初学一级) | 2023-12-07 21:32

@戈壁老王-:
是的,有兴趣可以了解下类加载的机制,分为五个过程“加载、验证、准备、解析、初始化”
类变量:在准备阶段会对类变量分配内存,初始化的时候会对类变量进行赋值。
成员变量:只有在对类实例化(执行new或者 调用Class<>>.newInstance())时,才会在堆中分配空间。
你可以试下下面这个程序

public class Test {

    static{
        System.out.println("single");
    }

    {
        System.out.println("multiple");
    }


    public static void main(String[] args) {
        System.out.println("------------");
        new Test();
        new Test();
    }
}

执行结果是这个

single
------------
multiple
multiple

在启动main方法的时候,会进行类加载,所以会打印single且只打印一次,
在每次执行new创建新实例的时候,会打印multiple。

此木|西贝 | 园豆:420 (菜鸟二级) | 2023-12-08 20:11

@此木|西贝: 感谢大佬解答

戈壁老王- | 园豆:159 (初学一级) | 2023-12-20 21:37

@戈壁老王-: 共同学习而已😀

此木|西贝 | 园豆:420 (菜鸟二级) | 2023-12-22 11:45
其他回答(1)
0

static在类被加载的时候就创建好了,所有后面调用不就直接返回s了吗,不会去执行new

小鸣Cycling | 园豆:350 (菜鸟二级) | 2023-12-03 10:38

谢谢

支持(0) 反对(0) 戈壁老王- | 园豆:159 (初学一级) | 2023-12-07 21:31
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册