記一次jvm類加載相關的問題

今天同學問了一個問題:爲什麼類的static引用可以指向一個自己的類實例。

所以我們先做個實驗,看一下如果不是static的引用會發生什麼

在這裏插入圖片描述

發生了棧溢出。

那麼如果是static引用呢?

在這裏插入圖片描述

可以看到,程序沒有問題。

翻看了周志明先生的《深入理解Java虛擬機》,我似乎找到了答案。

在這裏插入圖片描述

在這裏插入圖片描述

總結一下。
不是靜態的類成員變量,在對象實例化的時候隨對象一起分配在Java堆中。
那麼類的成員變量,在準備階段就會分配內存,在初始化階段就會執行static語句。

那麼回到這個問題。
當引用是實例變量時,引用在實例化的時候纔會進行賦值,就會引發一個新的實例化,然後就遞歸的引發實例化,導致棧溢出了,本質是由遞歸造成的。
當引用是類變量的時候(static),在類加載的準備階段就會爲類變量分配內存,在初始化階段就會執行static的語句,也就是() 方法,會實例化一個對象。而實例化的對象並沒有static的成員變量,所以就直接返回了對象。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章