#java 在类内部创建一个静态的自己的对象为什么不会死循环

在学习饿汉式单例设计模式的时候,博主突发奇想,为什么在类内创建一个自己的对象不会造成死循环呢?也就是说创建的这个对象中又需要创建一个对象,对象创建对象。。。

以下为饿汉式单例模式的代码:

alt

答案揭晓:

其实答案就藏在单例对象的修饰符static中,创建对象的语句为static语句,也就是说该语句只会在类加载时被执行一次,接下来就永远不会被执行了。

那么我们在调用该单例类的getInstance方法时候,首先进行类的加载,这时创建对象的语句被执行。这个被创建的StarvingMode对象被存放在堆中的Class对象中(或者方法区的静态域中),这两个内存空间都是专门用于存放静态变量的。

重点是!!这个新创建的对象在实例化的过程中不再调用创建对象的语句,因为该语句为静态语句,只在类加载时候执行一次!所以否定了死循环的可能。

一些思考和理解:

静态变量(属性)由类的所有对象共享

我们抛开单例设计模式不谈,假设程序中没有其他语句,只有第一条以静态方式创建自己的对象的语句(也就是说此时该类可以拥有多个对象),那么创建的每个对象其实都共享一个属性,这个属性就是在类加载时候创建的那个对象,而类加载时候创建的那个对象不也是一个该类的对象吗?它在作为其他对象的属性的同时,自己也是一个对象呀?事实上,它也有该条共享属性,就是它自己!!!

静态变量(属性)和普通对象在内存中的位置不同

在以往的案例中,静态域往往以基本数据类型出现,这时无法完全突出其与普通对象在内存中存放的位置的不同(因为他们本来就不是同一类东西,不存放在一起好像也合情合理?),而在本例中,静态变量就是一个对象,但是它不会跟后创建的其他对象一样存放在堆中分配的空间,而是具有单独的,独属于静态变量的空间(可能是堆中Class类,也可能是方法区静态域,取决于java版本),该类的所有对象都共享它,有一个属性共同指向它。

全部评论

相关推荐

07-09 15:55
门头沟学院 Java
点赞 评论 收藏
分享
哈哈哈哈哈哈哈哈哈哈这个世界太美好了
凉风落木楚山秋:毕业出路老师不管,你盖个章他好交差就完事了,等你盖完毕业了就不关他事情了
点赞 评论 收藏
分享
05-29 20:34
门头沟学院 C++
KarlAllen:得做好直接春招的准备。学历差的话,一是面试要求会比学历好的严格不少,二是就算面试通过了也会被排序。总之暑期和秋招对于学历差的就是及其不友好
无实习如何秋招上岸
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-10 13:54
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务