[Java基础]面向对象-内存解析

因为内存解析篇幅较长,我们单独拿出来讲解。

我们知道,方法执行,其实就对内存的操作,但具体是如何进行的呢?下面我们以生成“圆”为例,从内存的角度解析程序执行过程。

/**
* 圆
**/
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);

[Java基础]面向对象-内存解析_第1张图片

局部变量赋值给堆内存中的对象

 [Java基础]面向对象-内存解析_第2张图片  

构造函数结束,局部变量消失

[Java基础]面向对象-内存解析_第3张图片

[Java基础]面向对象-内存解析_第4张图片

[Java基础]面向对象-内存解析_第5张图片

我们整理一下,步骤1执行结束后,内存中的分布是:

[Java基础]面向对象-内存解析_第6张图片

按照同样的分析思路,步骤2执行完,内存的情况是(过程省略):

[Java基础]面向对象-内存解析_第7张图片

接下来我们看下步骤3的执行过程:

System.out.println("c1:(" + c1.getO().getX() + "," + c1.getO().getY() + ")," + c1.getRadius());

步骤3,考察点:方法的返回值在栈中也会占一部分空间;

我们还是按照从里向外,从左到右的步骤分析:

"c1:("  :是字符串常量,存在字符串常量池中;

[Java基础]面向对象-内存解析_第8张图片

 同理,println方法执行结束后,栈中的内存被释放

[Java基础]面向对象-内存解析_第9张图片

 同理可分析步骤4,5,6;

接下来我们分析下步骤7:

c1.setO(5, 6);

[Java基础]面向对象-内存解析_第10张图片

 同理,可分析步骤8,为C2赋值。

步骤7和步骤8赋值结束后,内存中的情况:

[Java基础]面向对象-内存解析_第11张图片

经过前面一步步分析,程序执行时内存的情况就很清晰了

步骤 9,10,11,12 和前面输出的步骤一样 ,这里就不再赘述。

      main方法结束后,因为main方法执行在栈中占用的空间将全部被释放。堆空间,将等垃圾回收执行后被释放。关于垃圾回收的内容,后面的文章将会分析。

        以上就是内存解析的全部过程了,希望能对你有所帮助。

你可能感兴趣的:(java基础,java)