#java 在类内部创建一个静态的自己的对象为什么不会死循环
在学习饿汉式单例设计模式的时候,博主突发奇想,为什么在类内创建一个自己的对象不会造成死循环呢?也就是说创建的这个对象中又需要创建一个对象,对象创建对象。。。
以下为饿汉式单例模式的代码:
答案揭晓:
其实答案就藏在单例对象的修饰符static中,创建对象的语句为static语句,也就是说该语句只会在类加载时被执行一次,接下来就永远不会被执行了。
那么我们在调用该单例类的getInstance方法时候,首先进行类的加载,这时创建对象的语句被执行。这个被创建的StarvingMode对象被存放在堆中的Class对象中(或者方法区的静态域中),这两个内存空间都是专门用于存放静态变量的。
重点是!!这个新创建的对象在实例化的过程中不再调用创建对象的语句,因为该语句为静态语句,只在类加载时候执行一次!所以否定了死循环的可能。
一些思考和理解:
静态变量(属性)由类的所有对象共享
我们抛开单例设计模式不谈,假设程序中没有其他语句,只有第一条以静态方式创建自己的对象的语句(也就是说此时该类可以拥有多个对象),那么创建的每个对象其实都共享一个属性,这个属性就是在类加载时候创建的那个对象,而类加载时候创建的那个对象不也是一个该类的对象吗?它在作为其他对象的属性的同时,自己也是一个对象呀?事实上,它也有该条共享属性,就是它自己!!!
静态变量(属性)和普通对象在内存中的位置不同
在以往的案例中,静态域往往以基本数据类型出现,这时无法完全突出其与普通对象在内存中存放的位置的不同(因为他们本来就不是同一类东西,不存放在一起好像也合情合理?),而在本例中,静态变量就是一个对象,但是它不会跟后创建的其他对象一样存放在堆中分配的空间,而是具有单独的,独属于静态变量的空间(可能是堆中Class类,也可能是方法区静态域,取决于java版本),该类的所有对象都共享它,有一个属性共同指向它。