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