静态属性 单例模式

骑猪看日落 2022-09-17 11:16 229阅读 0赞
  1. 所谓静态属性就是 static关键字修饰的类的属性,他所具有的特点是为所有对象或方法所共享的一个静态的属性,从内存的角度来理解,静态属性放在静态池中,只分配一次内存空间,随着JVM的结束而消失。
  2. stack(栈)是JVM的内存指令区。stack管理很简单,push一定长度字节的数据或者指令,stack指针压栈相应的字节位移;
  3. pop一定字节长度数据或者指令,stack指针弹栈。stack的速度很快,管理很简单,并且每次操作的数据或者指令字节长度是已知的。
  4. 所以Java 基本数据类型,Java 指令代码,常量都保存在stack中。
  5. heap (堆)是JVM的内存数据区。heap 的管理很复杂,每次分配不定长的内存空间,专门用来保存对象的实例。
  6. heap 中分配一定的内存来保存对象实例,实际上也只是保存对象实例的属性值,属性的类型和对象本身的类型标记等,
  7. 并不保存对象的方法(方法是指令,保存在stack中),在heap 中分配一定的内存保存对象实例和对象的序列化比较类似。
  8. 而对象实例在heap 中分配好以后,需要在stack中保存一个4字节的heap 内存地址,用来定位该对象实例在heap 中的位置,便于找到该对象实例。
  9. 总结一下该过程:当一个class文件被ClassLoader load进入JVM后,方法指令保存在stack中,此时heap区没有数据。
  10. 然后程序技术器开始执行指令,如果是静态方法,直接依次执行指令代码,当然此时指令代码是不能访问heap 数据区的;
  11. 如果是非静态方法,由于隐含参数没有值,会报错。因此在非静态方法执行前,要先new对象,在heap中分配数据,
  12. 并把stack中的地址指针交给非静态方法,这样程序技术器依次执行指令,而指令代码此时能够访问到heap数据区了。
  13. 总结一下:静态属性保存在stack指令内存区,动态属性保存在heap 数据内存区。
  14. //单例模式
  15. package com.uniteque;
  16. public class SingletonInstance {
  17. //1.该对象的构造方法为private,因为只能实例化一次,并且只能在该类内部实例化,不能再该类之外实例化
  18. private SingletonInstance(){
  19. }
  20. //2.该类内部实例化,作为常量,加载到jvm中
  21. public final static SingletonInstance single = new SingletonInstance();
  22. //3.唯一实例只能通过getSingleton()方法访问获得
  23. public static SingletonInstance getSingleton(){
  24. return single;
  25. }
  26. }

发表评论

表情:
评论列表 (有 0 条评论,229人围观)

还没有评论,来说两句吧...

相关阅读

    相关 静态属性 模式

    所谓静态属性就是 用static关键字修饰的类的属性,他所具有的特点是为所有对象或方法所共享的一个静态的属性,从内存的角度来理解,静态属性放在静态池中,只分配一次内存空

    相关 模式静态

      单例模式还是静态类,这是一个老话题了,从我刚开始接触Java的时候就看到这样的讨论。在这里我总结一下,也添加一点点新东西。 首先要澄清和区别一些概念,“静态类”和“所有方