一.一个对象的内存图
Student s=new Student()
1.加载class文件
在Student的字节码文件,加载到内存
2.申明局部变量
把等号左边s进行申明
3.在堆内存中开辟一个空间
等号右边开辟的新空间
4.默认初始化
5.显示初始化
6.构造方法初始化
7.将堆内存中的地址值赋值给左边的局部变量
8.图示 :
9.过程:
1.将TestStudent字节码加载到方法区里面
2.main方法会加载到栈里面
3.在方法区里面会进行临时存储:
String name;
int age;
study()
4.执行main方法,申请一个局部变量s能够存储地址值。
5.new后面在堆里面开出一个空间
1.将方法区里面的成员变量,和方法都拷贝一份过来
2.默认初始化
name:0 age:0
3.显示初始化
在定义变量的时候直接给值了,默认初始化初始值就会被覆盖。
4.构造方法初始化
构造方法里面什么都没写,可以省去
6.将堆内存里面的地址赋值给左边的变量s
图示:默认指针
图示:赋值成功
7.main方法执行完毕
出栈,没有变量指向这个空间了,这个空间也会消失,变成垃圾。
二.两个对象的内存图
第二次创建对象的时候,字节码文件不用创建两次,直接使用就行了。
第二个对象又有新的地址。
三基本数据类和引用数据类
1.基本数据类型:
int a
开辟一个新空间,整数10存在当前空间。
double b
又开辟了一个空间,存储浮点数b
2.引用数据类型
拿别人空间里面的数据来进行使用。变量的名字存储在栈中,地址存储在堆中。
四.用图表示基本数据类型和引用数据类型
1.基本数据类型
string a=10
string b=a
赋值的是真正值,修改b的值,不会影响到a。
2.引用数据类型
int [] arr1={a,b,c}
int [] arr2=arr1
修改arr2的值,arr1里面的值也会跟着发生改变。
图示: