案例
Person.java
public class Person {
public String name;
public char sex;
public int age;
public void show(){
int age = this.age + 20;
System.out.printf("二十年后 姓名: %s 性別: %c 年齡: %d",name,sex,age);
}
}
PersonTest.java
public class PersonTest {
public static void main(String[] args) {
Person p = new Person();
p.name = "張三";
p.sex = '男';
p.age = 24;
p.show();
}
}
執行順序
- 執行
java PersonTest命令后,jvm將PersonTest.class、Person.class``System.class三個檔案加載到方法區, - jvm在加載的檔案中找到main方法并將方法壓堆疊到堆疊區,
- 接著main方法中宣告了Person型別的參考p,使用
new關鍵字實體化Person物件存盤在堆區,并將物件記憶體地址存盤在p的記憶體中, - 由于java中沒有指標這個概念,堆區中的內容必須通過參考去訪問,
- 接下來使用p的參考去訪問堆區中對應物件的成員變數并改變它們的值,
- 通過物件參考p呼叫了成員方法show,此時show方法的內部變數被壓堆疊,開辟int型別大小的記憶體空間存盤由cpu計算的成員變數age和字面量20的和,
- show方法中對于System的呼叫同理,不再贅述,使用printf方法格式化輸出相關變數的值,
- 完成show方法后,方法彈堆疊,銷毀變數、清理記憶體空間,然回到main方法中,
- main方法執行完畢,彈堆疊退出程式,
注意
- JVM中有方法區、堆區、堆疊區三個記憶體空間的劃分,
- 方法區存盤參考型別的代碼,包括類中的靜態變數,
- 堆區存放new出來的實體物件,也是GC自動垃圾回識訓制的主要作業地方,
- 堆疊區中存放區域變數和方法的呼叫,每個方法呼叫會有一個獨立的堆疊幀,方法退出后會清理掉,
- 方法區和堆區永遠只有一個,堆疊區是每個執行緒有一個,
圖示

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/270598.html
標籤:Java
上一篇:進制及其轉換
下一篇:JAVA中如何實作字串的反轉?
