鱼C论坛

 找回密码
 立即注册
查看: 785|回复: 3

[已解决]单例模式内存解析

[复制链接]
发表于 2023-2-25 22:59:21 | 显示全部楼层 |阅读模式
50鱼币
  1. 饿汉式1:
  2. class Bank{
  3.        
  4.         //1.私化类的构造器
  5.         private Bank(){
  6.                
  7.         }
  8.        
  9.         //2.内部创建类的对象
  10.         //4.要求此对象也必须声明为静态的
  11.         private static Bank instance = new Bank();
  12.        
  13.         //3.提供公共的静态的方法,返回类的对象
  14.         public static Bank getInstance(){
  15.                 return instance;
  16.         }
  17. }
复制代码


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

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

问题3:静态变量,静态方法,new Bank(),这三个执行的顺序是怎么样的,是静态先加载吗,最后再new对象?
最佳答案
2023-2-25 22:59:22
1. 单例中定义了当前类的静态变量instance,在Java中,static修饰的成员在类加载时就会被初始化并分配存储空间,因此在类加载完成时,instance对象已经被创建。因此,在getInstance()方法第一次调用时,instance对象已经存在,直接返回该对象即可。

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

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

最佳答案

查看完整内容

1. 单例中定义了当前类的静态变量instance,在Java中,static修饰的成员在类加载时就会被初始化并分配存储空间,因此在类加载完成时,instance对象已经被创建。因此,在getInstance()方法第一次调用时,instance对象已经存在,直接返回该对象即可。 2. 静态成员确实不能访问非静态成员,但是在静态代码块或静态变量初始化时,可以访问其他静态成员,包括非常数的静态成员。在这里,由于instance是一个静态变量,其内存空间在类 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-2-25 22:59:22 | 显示全部楼层    本楼为最佳答案   
1. 单例中定义了当前类的静态变量instance,在Java中,static修饰的成员在类加载时就会被初始化并分配存储空间,因此在类加载完成时,instance对象已经被创建。因此,在getInstance()方法第一次调用时,instance对象已经存在,直接返回该对象即可。

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

3. 类加载时,静态块和静态变量初始化优先执行,然后执行构造器。因此,静态变量instance会在类加载时被初始化并分配内存空间。在调用getInstance()方法获取Bank实例时,直接返回初始化好的静态变量instance。因此,静态块和静态变量优于构造器执行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-2-26 09:17:39 | 显示全部楼层
本帖最后由 洋洋痒 于 2023-2-26 09:35 编辑

我是傻子,跑错板块了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-2-27 16:27:42 | 显示全部楼层
看不懂。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 15:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表