前提: 区分成员变量和局部变量
建议先看一下这篇博客: java中的基本数据类型和引用数据类型内存中的位置_向上的"狼"的博客-CSDN博客
成员变量: 在类中直接定义的变量
局部变量: 在方法体内定义的变量
举例说明类实例化中内存的变化
学生类
class Student{
private Integer idCard;
private String name;
public Student(){}
public Student(Integer idCard, String name){
this.idCard = idCard;
this.name = name;
}
//方法show()
public void show(){
System.out.println("学号为"+this.idCard+",名字为"+this.name);
}
public Integer getIdCard() {
return idCard;
}
public void setIdCard(Integer idCard) {
this.idCard = idCard;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
主函数
class ClassTest {
public static void main(String[] args) {
Integer idCard = 1;
String name = "张三";
Student student = new Student(1, "张三");
student.show();
}
}
图解法展示内存变化
我们知道,java中在类的实例化过程中,内存中会使用这三个区域,栈区,堆区和方法区。
1: 在程序执行的过程中,首先,类中的成员变量和方法体进入到方法区。
2: 然后main()函数方法体进入栈区,这一过程叫做进栈(压栈)定义了一个用于指向Student类的实例
3: 在堆区内创建一个实例 Student stu = new Student()的实例。然后将成员变量和成员方法放在new实例中,引用变量放在栈中,并且根据地址指向堆中的地址。将成员变量放在new实例中的过程中是取成员方法的地址值。
4: 调用类中的构造器进行赋值操作
5: 然后调用方法体void show(),在调用方法体的过程中,先在栈区找到student,后根据地址值找到new Studnet() 进行方法体调用
6: 在方法体void show()被调用完成后,就会立刻马上从栈内弹出(出站)
7: 最后,栈中存放的引用变量, 调用的构造器开始弹栈, 在main()函数完成后,main()函数也会出栈
注: 在执行main方法的时候首先执行的是Integer idCard = 1, String name = "张三"; 首先因为是局部变量, 所以Integer idCard是放到栈中, 然后去常量池中查找为1的值, 找到了就返回引用地址, 没有找到就在字符串常量池中创建一个常量1,String name 也是同样的道理, 这里就不再赘述了.