關於Java中new的理解


 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM