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

来源:互联网 发布:seo如何添加栏目 编辑:程序博客网 时间:2024/06/08 19:47

首先,我门来看看Java中的变量分类。如下图:
这里写图片描述

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

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");    }}

首先给出运行结果:
这里写图片描述

以上的运行结果的代码执行顺序如下图所示:
这里写图片描述

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

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

原创粉丝点击