单例模式内存解析
饿汉式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对象? 1. 单例中定义了当前类的静态变量instance,在Java中,static修饰的成员在类加载时就会被初始化并分配存储空间,因此在类加载完成时,instance对象已经被创建。因此,在getInstance()方法第一次调用时,instance对象已经存在,直接返回该对象即可。
2. 静态成员确实不能访问非静态成员,但是在静态代码块或静态变量初始化时,可以访问其他静态成员,包括非常数的静态成员。在这里,由于instance是一个静态变量,其内存空间在类加载时已经被分配,new Bank()只是将该对象引用赋给了instance静态变量。
3. 类加载时,静态块和静态变量初始化优先执行,然后执行构造器。因此,静态变量instance会在类加载时被初始化并分配内存空间。在调用getInstance()方法获取Bank实例时,直接返回初始化好的静态变量instance。因此,静态块和静态变量优于构造器执行。 本帖最后由 洋洋痒 于 2023-2-26 09:35 编辑
我是傻子,跑错板块了 看不懂。
页:
[1]