浅谈谈Java变量在内存中的运行机制

首先,我门来看看Java中的变量分类。如下图:
浅谈谈Java变量在内存中的运行机制_第1张图片

接下来我们通过代码来分析内存中的变量

public class VariableTest {

    public static void main(String[] args) {
        //在创建MyTest实例前访问类变量
        System.out.println("*********************进入main()方法*********************\n");
        System.out.println("访问MyTest类的类变量:staticStr = " + MyTest.staticStr);
        MyTest myTest = new MyTest("实例变量值");
        System.out.println("*********************离开main()方法*********************\n");
    }

}
class MyTest {
    public static String staticStr;
    private String instanceStr;

    static {
        System.out.println("*************进入静态代码块*************");
        System.out.println("初始化类变量staticStr = " + (staticStr = "类变量staticStr值"));
        int i = 10;//局部变量需要显式初始化后才能使用
        System.out.println("定义并初始化静态代码块中的局部变量 i = " + i);
        System.out.println("*************离开静态代码块*************\n");
    }
    {
        System.out.println("*************进入普通代码块*************");
        System.out.println("获取实例变量instanceStr的初始值:instanceStr = " + instanceStr);
        int i = 140;
        System.out.println("定义并初始化局部变量 i = " + i);
        System.out.println("*************离开普通代码块*************\n");
    }

    public MyTest(String instanceStr) {
        System.out.println("***************进入构造器***************");
        this.instanceStr = instanceStr;
        System.out.println("获取初始化后的实例变量 instanceStr = " + this.instanceStr);
        System.out.println("***************离开构造器***************\n");
    }

    public static void staticMethod(String param) {
        System.out.println("*************进入静态方法staticMethod()**************");
        int i = 110;
        System.out.println("静态代码块中的局部变量: i = " + i);
        System.out.println("*************离开静态方法staticMethod()**************\n");
    }
    public void method(String param) {
        System.out.println("*************进入实例方法method()**************");
        int i = 110;
        System.out.println("实例方法中的局部变量: i = " + i);
        System.out.println("*************离开实例方法method()**************\n");
    }
}

首先给出运行结果:
浅谈谈Java变量在内存中的运行机制_第2张图片

以上的运行结果的代码执行顺序如下图所示:
浅谈谈Java变量在内存中的运行机制_第3张图片

在给出内存图之前首先明白一点:对于局部变量,其作用范围就是该方法体或者代码块,也就是说局部变量随着方法或者代码块的开始而开始,结束而结束。因此,我们只演示成员变量在内存中的运行机制。
类准备阶段:在堆内存中只由MyTest类的信息包括类变量staticStr——此时系统已经为staticStr分配了内存空间并赋予了默认初始值。
浅谈谈Java变量在内存中的运行机制_第4张图片
在创建对象后,栈内存中才会出现对象的引用变量以及在堆内存中由对应的对象。如图所示:
浅谈谈Java变量在内存中的运行机制_第5张图片
完毕!

献此拙文,如有错误或不足,欢迎留言指正!

你可能感兴趣的:(Java——温故而知新系列)