因为内存解析篇幅较长,我们单独拿出来讲解。
我们知道,方法执行,其实就对内存的操作,但具体是如何进行的呢?下面我们以生成“圆”为例,从内存的角度解析程序执行过程。
/**
* 圆
**/
public class Circle {
private CirclePoint o; // 圆心
private double radius; // 半径
public CirclePoint getO() {
return o;
}
public void setO(double i, double j) {
o.setX(i);
o.setY(j);
}
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
public double getArea() {
return 3.14 * radius * radius;
}
// 无参构造函数
Circle(CirclePoint o, double r) {
this.o = o;
this.radius = r;
}
// 自定义初始值的构造函数
Circle(double r) {
o = new CirclePoint(0, 0);
radius = r;
}
Circle() {
}
}
/**
* 圆心
**/
class CirclePoint {
private double x;
private double y;
CirclePoint() {
}
CirclePoint(double x1, double y1) {
this.x = x1;
this.y = y1;
}
public double getX() {
return x;
}
public double getY() {
return y;
}
public void setX(double x) {
this.x = x;
}
public void setY(double y) {
this.y = y;
}
}
/**
* test
**/
class TestCircle {
public static void main(String[] args) {
Circle c1 = new Circle(new CirclePoint(1.0, 2.0), 2.0); // 1
Circle c2 = new Circle(5.0); // 2
System.out.println("c1:(" + c1.getO().getX() + "," + c1.getO().getY() + ")," + c1.getRadius()); // 3
System.out.println("c2:(" + c2.getO().getX() + "," + c2.getO().getY() + ")," + c2.getRadius()); // 4
System.out.println("c1 area = " + c1.getArea()); // 5
System.out.println("c2 area = " + c2.getArea()); // 6
c1.setO(5, 6); // 7
c2.setRadius(9.0); // 8
System.out.println("c1:(" + c1.getO().getX() + "," + c1.getO().getY() + ")," + c1.getRadius()); // 9
System.out.println("c2:(" + c2.getO().getX() + "," + c2.getO().getY() + ")," + c2.getRadius()); // 10
System.out.println("c1 area = " + c1.getArea()); // 11
System.out.println("c2 area = " + c2.getArea()); // 12
}
}
步骤1执行过程:
Circle c1 = new Circle(new CirclePoint(1.0, 2.0), 2.0);
局部变量赋值给堆内存中的对象
构造函数结束,局部变量消失
我们整理一下,步骤1执行结束后,内存中的分布是:
按照同样的分析思路,步骤2执行完,内存的情况是(过程省略):
接下来我们看下步骤3的执行过程:
System.out.println("c1:(" + c1.getO().getX() + "," + c1.getO().getY() + ")," + c1.getRadius());
步骤3,考察点:方法的返回值在栈中也会占一部分空间;
我们还是按照从里向外,从左到右的步骤分析:
"c1:(" :是字符串常量,存在字符串常量池中;
同理,println方法执行结束后,栈中的内存被释放
同理可分析步骤4,5,6;
接下来我们分析下步骤7:
c1.setO(5, 6);
同理,可分析步骤8,为C2赋值。
步骤7和步骤8赋值结束后,内存中的情况:
经过前面一步步分析,程序执行时内存的情况就很清晰了
步骤 9,10,11,12 和前面输出的步骤一样 ,这里就不再赘述。
main方法结束后,因为main方法执行在栈中占用的空间将全部被释放。堆空间,将等垃圾回收执行后被释放。关于垃圾回收的内容,后面的文章将会分析。
以上就是内存解析的全部过程了,希望能对你有所帮助。