执行代码过程中的内存分配情况(简单化)
以下面这个代码为例
class Car{
String color = "red";
int num = 4;
void show(){
int a = 10;
System.out.println("color="+color+",num="+num);
}
}
class CarTest {
public static void main(String[] args) {
Car c1 = new Car();
Car c2 = new Car();
c1.color = "blue";
c1.show();
c2.show();
}
}
-
首先我们要知道。在面向对象过程中,声明的声明变量存储在栈空间中。new出来的对象存储与堆空间中。如上面代码中,c1存储在栈中,对象存储在堆中。栈中存储了一个地址值与堆之间通过地址值连接,通过栈空间的地址值就能找到堆空间的对象。
-
堆空间中存储着类的属性,属性最初都是默认初始值。String类型为null,int类型为0。
-
根据赋值情况,对堆空间中的变量进行赋值
-
同样地c2也是上面这种说明
-
在调用c1之前,出现了一次赋值情况,把color改成red
-
然后调用c1的show方法,里面的局部变量a存储在栈空间中值为10
-
用c1调用show,栈中的局部变量a就出栈也就是被销毁。 输出对象时,哪个对象调的方法那么输出时,color,num就是谁的值 。输出结果为color=blue,num=4;
-
然后通过c2调用show,栈中又会出现变量a,然后调用c2,输出color与num的值 ,第二次的变量a也出栈
-
调用完后,main方法也就结束了栈与堆的链接也随之结束 ,c1与c2也相继结束弹出,指针也随之消失,堆空间中的结构也就被回收