今天同學問了一個問題:爲什麼類的static引用可以指向一個自己的類實例。
所以我們先做個實驗,看一下如果不是static的引用會發生什麼
發生了棧溢出。
那麼如果是static引用呢?
可以看到,程序沒有問題。
翻看了周志明先生的《深入理解Java虛擬機》,我似乎找到了答案。
總結一下。
不是靜態的類成員變量,在對象實例化的時候隨對象一起分配在Java堆中。
那麼類的成員變量,在準備階段就會分配內存,在初始化階段就會執行static語句。
那麼回到這個問題。
當引用是實例變量時,引用在實例化的時候纔會進行賦值,就會引發一個新的實例化,然後就遞歸的引發實例化,導致棧溢出了,本質是由遞歸造成的。
當引用是類變量的時候(static),在類加載的準備階段就會爲類變量分配內存,在初始化階段就會執行static的語句,也就是() 方法,會實例化一個對象。而實例化的對象並沒有static的成員變量,所以就直接返回了對象。