张世来4610484 发表于 2023-2-25 22:59:21

单例模式内存解析

饿汉式1:
class Bank{
       
        //1.私化类的构造器
        private Bank(){
               
        }
       
        //2.内部创建类的对象
        //4.要求此对象也必须声明为静态的
        private static Bank instance = new Bank();
       
        //3.提供公共的静态的方法,返回类的对象
        public static Bank getInstance(){
                return instance;
        }
}


问题1:单例中,定义了当前类的静待变量,为什么可以在自己类中,new自己啊,在执行new Bank()这一行中,我类都还没加载完,为什么还能new一个自己类的对象?

问题2:静态不是不能调用非静态吗,静态的加载不应该早于实例吗,为什么可以将new Bank()直接赋值给静态变量呢?

问题3:静态变量,静态方法,new Bank(),这三个执行的顺序是怎么样的,是静态先加载吗,最后再new对象?

sfqxx 发表于 2023-2-25 22:59:22

1. 单例中定义了当前类的静态变量instance,在Java中,static修饰的成员在类加载时就会被初始化并分配存储空间,因此在类加载完成时,instance对象已经被创建。因此,在getInstance()方法第一次调用时,instance对象已经存在,直接返回该对象即可。

2. 静态成员确实不能访问非静态成员,但是在静态代码块或静态变量初始化时,可以访问其他静态成员,包括非常数的静态成员。在这里,由于instance是一个静态变量,其内存空间在类加载时已经被分配,new Bank()只是将该对象引用赋给了instance静态变量。

3. 类加载时,静态块和静态变量初始化优先执行,然后执行构造器。因此,静态变量instance会在类加载时被初始化并分配内存空间。在调用getInstance()方法获取Bank实例时,直接返回初始化好的静态变量instance。因此,静态块和静态变量优于构造器执行。

洋洋痒 发表于 2023-2-26 09:17:39

本帖最后由 洋洋痒 于 2023-2-26 09:35 编辑

我是傻子,跑错板块了

85538946a 发表于 2023-2-27 16:27:42

看不懂。
页: [1]
查看完整版本: 单例模式内存解析