首先,我门来看看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分配了内存空间并赋予了默认初始值。
在创建对象后,栈内存中才会出现对象的引用变量以及在堆内存中由对应的对象。如图所示:
完毕!
献此拙文,如有错误或不足,欢迎留言指正!