1 public class PersonTest { 2 public static void main(String[] args){ 3 Person person = new Person("大火",18); 4 person.show(); 5 } 6 } 7 8 class Person{ 9 public String name; 10 public int age; 11 12 public Person(){}; 13 public Person(String name, int age) { 14 System.out.println("我的名字是"+name); 15 System.out.printf("我今年%d歲了%n",age); 16 } 17 18 public static void show() { 19 System.out.println("我是一名歌手"); 20 } 21 }
在jvm虛擬機運行Java程序的過程中,會將內存划分為若干個不同的區域,大概分為
- PC寄存器(Program counter register)
- Java虛擬機棧(Java virtual machine stack)
- 堆(Heap)
- 方法區(Method area)
- 本地方法棧(Native method stack)
在以上程序運行的過程中
按我的理解,jvm先將兩個class文件加載到內存中,首先將兩個class文件分配到方法區中,然后進入程序入口main運行Java程序
首先聲明一個Person類型的變量person,然后new出一個對象實例person將其地址值分配給變量person
聲明的Person類型變量person在Java虛擬機棧內,new出的對象實例person在堆空間內
在new person的時候,jvm首先在方法區內查找有沒有person類,此時發現有,然后將person類中的成員變量與方法的地址值拿來放到自己內存中,然后將自身的地址值傳遞給之前聲明的變量person
此時,Person person = new Person();的過程結束
然后發現new Person()中含有兩個參數 "大火" 和 18 ,然后jvm開始去方法區查找有沒有符合參數類型的構造方法,發現有,開始傳遞參數,將 "大火" 傳遞給 String name;將 18 傳遞給 int age;
此時的傳遞是傳遞到堆空間中 new 出來的 Person(); 傳遞完畢執行構造方法中的打印語句打印出事先編輯好的內容;此時返回棧空間繼續執行main方法,
遇到 person.show(); 開始執行該語句,首先去堆空間查看 變量person 的地址,然后去堆空間找到person所指向的實例 new Person(),然后找到事先存儲好的 show() 的地址,去方法區內找到 show() 方法
然后打印出事先編輯好的內容,隨后main方法結束,堆空間內Person實例沒有被指向的引用,CG開始回收,程序結束。
2021-09-30