zoukankan      html  css  js  c++  java
  • JAVA-初步认识-第八章-单例设计模式-内存图解

    一.

    接下来探讨的是,单例设计模式的三句话在内存中到底是什么样的?

    这里一定要铭记,本题是单例,单个对象。为了实现这样的目标,主函数中的语句自然和之前的不一样。

    这进行了改变,main所属的类进行了省略,将SingleDemo类省去了,为了便于讲解。

    所有的操作都是从主函数进栈开始,它是程序的入口。

    方法区是分为两部分,都属于Single类,Single类这个描述类中的所有代码貌似都是进入了方法区,生命周期比较长。

    讲解一下流程,首先是主函数进栈,接着s1也进栈,执行的main中的第一条语句,Single s1=Single.getInstance(),等式左边进栈后,接着就是右边的类调用方法。类调用方法,就是Single类进入方法区,同时默认构造函数(非静态的)也进入非静态区,同时类中的其余的静态代码,静态的新建对象和静态的getInstance()也都进入静态区。getInstance()方法是将其所有代码输入静态区,而静态新建对象进入是将局部变量载入,且初始化为null(在方法区里面,成员变量也有默认值,只要是成员都会有),因为是类类型引用对象,同时在堆内存中创建Single类类型对象,分配地址编号,(这里对象初始化时,可能要将构造函数载入栈中),这个变量目前不在栈里面,在方法区里面。对象新建结束后,将地址值赋值给方法区静态区的s,完成指向。到目前为止,main中的第一句右侧的Single就执行结束了,接着就是Single类调用getInstance()方法了。这时,getInstance()方法就进栈了。进栈完以后,它没有this,因为它是静态的,进栈后,直接运算里面内容的时候,就是return s。这个方法一运算完,返回一个s,这s的值就赋给了s1。方法运算完,会给s1一个结果,这结果就是0x0045。一运算完,getInstance()方法就弹栈了,同时,s1就指向了对象了。main中的第二句Single s2=Single.getInstance(), 先是在栈中产生了s2,接着又调用了一次方法,运算完的结果,同样是s2指向了对象。最后一句就是System.out.println(s1==s2),就是比较s1和s2是否相等,在内存中只有一个对象,两者肯定相等。

    上面所讲述的一切,都是为了验证单例模式三句话在内存中的分布,结果表明就是单例,且外部程序调用的都是同一个对象。

  • 相关阅读:
    (mysql)卸载5.0安装6.05出现“Error Nr. 2003 : Can't connect to MySQL server on 'localhost' (10061). ”的解决办法
    (Redundancy)关于服务器冗余的几个疑问,请知道的帮忙解答.
    (C#)XML文件操作3
    POJ 3635 Full Tank(最短路径变形 + 优先队列)
    POJ 2286 The Rotation Game(DFS + 迭代加深)
    POJ 1141 Brackets Sequence(区间DP + 打印路径)
    POJ 3460 Booksort(IDA* + 估价函数设计)
    POJ 2908 Quantum(BFS + 优先队列)
    NOI 1997 积木游戏(解题报告)
    NYOJ 110 决斗(区间DP + 黑书例题)
  • 原文地址:https://www.cnblogs.com/wsw-bk/p/7717675.html
Copyright © 2011-2022 走看看