1. 程式人生 > >【java面向物件】記憶體分析

【java面向物件】記憶體分析

情景匯入

今天小編來說說一個物件的基本初始化過程。下面這個小demo有Student和StudentTest兩個類。 Student類: 成員變數:name,age 成員方法:study,eat 在這裡插入圖片描述 StudentTest類中: (1)建立物件——輸出成員變數的值,這裡輸出的是預設值 (2)給成員變數賦值——再次輸出成員變數的值,輸出的是賦值後的 (3)最後呼叫了方法

在這裡插入圖片描述 執行結果: 在這裡插入圖片描述

準備工作

在記憶體中有3個區:棧、堆、方法區。 方法區中分為兩部分,一部分是StudentTest;一部分是Student,有成員變數、成員方法,其中成員方法有個地址:001 在這裡插入圖片描述 程式執行,將main()方法載入到棧,開闢一個空間 在這裡插入圖片描述

執行Student s=new Student();

在此空間中,出現Student s 在這裡插入圖片描述 在堆記憶體中執行new Student() 在這裡插入圖片描述 在堆記憶體中開闢一個空間,裡面的資料參照Student,特殊的是成員方法中存的是方法區中的地址。最後自身再生成一個地址,002,並把它賦值給p 在這裡插入圖片描述

輸出成員變數

輸出成員變數時,s通過002找到堆中相對應的區域。

呼叫 結果
s.age 年齡:0
給成員變數賦值

在這裡插入圖片描述 再次輸出:

呼叫 結果
s.age 年齡:15
呼叫成員方法

調方法中,s通過002找到堆中的001,然後再找到方法區中的study(),將其載入到棧記憶體,開闢空間。執行study()方法,將“小紅”傳到Student中,然後輸出“向小紅學習”。 在這裡插入圖片描述

方法被呼叫完畢後,就會被清除。 在這裡插入圖片描述 eat()方法也是如此。 在這裡插入圖片描述 方法執行完畢後,mian()也就執行完畢了,也在記憶體中消失。 在這裡插入圖片描述