棧:用來執行函式。可以儲存區域性資訊
堆:用來儲存new出來的實體 (特點:每乙個實體所開闢的空間都有乙個位址;每乙個實體中儲存的資料都有乙個預設初始值)
方法區:存放.class和static (方法區其實是由n多個小的區域構成。有存放非靜態內容的非靜態區域,還有存放靜態內容的靜態區域,還有存放常量的常量池等)
jvm會先去方法區中找有沒有相應類的.class存在。如果有,就直接使用;如果沒有,則把相關類的.class載入到方法區
在.class載入到方法區時,會分為兩部分載入:先載入非靜態內容,再載入靜態內容
1). 把.class中的所有非靜態內容載入到方法區下的非靜態區域內
2). 載入靜態內容:
2.2.1. 把.class中的所有靜態內容載入到方法區下的靜態區域內
2.2.2. 對所有的靜態變數進行預設初始化
2.2.3. 對靜態變數進行顯式初始化
2.2.4. 執行靜態**塊
在堆記憶體中開闢一塊空間
給開闢空間分配乙個位址
把物件的所有非靜態成員載入到所開闢的空間下
對所有非靜態成員變數進行預設初始化
呼叫建構函式,分為兩部分:
先執行建構函式中的隱式三步,再執行建構函式中書寫的**。
1)隱式三步:
1,執行super語句
2,對開闢空間下的所有非靜態成員變數進行顯式初始化
3,執行構造**塊
2)執行建構函式中書寫的**把空間分配的位址賦值給乙個引用物件
舉例:
class
person
} class
student
extends
person
}
a:將person.class檔案載入到記憶體中。
b:在堆記憶體中建立乙個物件person。
c:把person中的屬性進行預設初始化。
d:把person中的屬性進行顯式初始化。
e:呼叫構造**塊
f:呼叫建構函式進行初始化。
g:在棧記憶體中宣告person型別的變數p。
h:把堆記憶體的位址(引用)賦給了棧記憶體中p。
class singleton
public
static singleton getinstance()
}public
class test
}
列印:
count1=1
count2=0
分析:
1.singleton singleton = singleton.getinstance();呼叫類singleton的靜態方法,觸發了類的初始化
2. 類載入時在準備過程中為類的靜態變數分配記憶體並初始化預設值 singleton=null count1=0,count2=0
3. 類初始化後,為類的靜態變數賦值和執行靜態**快。singleton賦值為new singleton()呼叫類的構造方法
4. 呼叫類的構造方法後count1和count2都要自增加1,因此count=1 count2=1
5. 執行列印語句:繼續為count1與count2賦值,此時count1沒有賦值操作,因此count1為1,但是count2執行賦值操作就變為0
Java 類載入過程
1 載入 載入的過程本質上是乙個讀取二進位制資料的過程。可以是檔案,網路資料,記憶體中的資料等,這一階段是可以自定義的。載入過程中會在堆中初始化乙個 class 物件。2 驗證 驗證就是驗證這堆二進位制資料是不是有效的,就是這個 class 資料是否可以載入虛擬機器。例如驗證檔案是否是 0xcafe...
java類的載入過程
以person person new person 為例進行說明 1 因為new用到了person.class,所以會先找到person.class檔案,並載入到記憶體中 2 執行該類中的static 塊,如果有的話,給person.class類進行初始化 3 在堆記憶體中開闢空間分配記憶體位址 4...
類的載入過程
類的載入過程 1 在建立物件時,會先判斷物件所屬的型別 類 在記憶體中是否存在,如果存在則直接使用 如果不存在,則把類載入到記憶體中的方法區下 2 在把類 class 載入到方法區時,分兩種情況 2.1 從.class檔案的上面向下依次載入內容 2.2 靜態的內容載入到方法區的靜態區域下 非靜態內容...