1:运行程序的时候,jvm虚拟机先把TestStudent.class 通过类加载器,加载到方法区
2:开始执行TestStudent.class的程序,从上往下,从左到右。执行到main方法
3:把main方法压入栈内存开始执行
4:执行 Student student是一个类。
4.1需要把Student.class文件通过jvm虚拟机加载到方法区。
4.2同时new出来的对象都需要从方法区复制到堆内存中(需要对堆内存中的成员变量进行初始化,String类型初始化null,int类型初始化0),但是 堆内存的对象里面的成员方法,只是一个方法地址,指向的是方法区的对象里面的方法
4.3: 从上到下执行,
Student student = new Student();
System.out.println(student); -- com.example.demobase.day.one.Student@65b54208
System.out.println("name:"+student.name+"..........age:"+student.age); --name:null..........age:0
student.age=1; student.name="陈豪"; (给堆内存中的变量赋值。)
System.out.println("name:"+student.name+"...........age:"+student.age); --name:陈豪...........age:1
student.study();。调用方法,先通过该对象的地址找到,堆内存中的对象,2:再找到该对象中的方法地址,3:最后找到方法区内的该方法,同时把这个方法压入栈内存中。执行该方法。输出 System.out.println("学习");
5:
Student student2 = new Student();(通过方法区内的student类再复制一份到,堆内存,而不是用之前对堆内存在的student对象,剩下的流程和第一次复制一样)
student2.age=1; student2.name="陈豪"; (给堆内存中的变量赋值。)
System.out.println("name:"+student2.name+"...........age:"+student2.age); --name:陈豪...........age:1
student2.study();。调用方法,先通过该对象的地址找到,堆内存中的对象,2:再找到该对象中的方法地址,3:最后找到方法区内的该方法,同时把这个方法压入栈内存中。执行该方法。输出 System.out.println("学习");