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是否相等,在内存中只有一个对象,两者肯定相等。

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

 

posted @ 2017-10-23 16:52  前锋营  阅读(320)  评论(0编辑  收藏  举报