public class TestVariable { static int s; int i; int j; { int i = 1; i++; j++; s++; } public void test(int j) { j++; i++; s++; } public static void main(String[] args) { TestVariable obj1 = new TestVariable(); TestVariable obj2 = new TestVariable(); obj1.test(10); obj1.test(20); obj2.test(30); System.out.println(obj1.i + "," + obj1.j + "," + obj1.s); System.out.println(obj2.i + "," + obj2.j + "," + obj2.s); }
①声明的位置
②修饰符
③值存储的位置
④作用域
⑤生命周期
根据以上区别,图示展示当前变量在jvm内存中的位置
java中执行main方法整体流程图示如下
1、栈中的main方法区,内存中的局部变量ob1,obj2,指向堆中的 new TestVariable()对象,new TestVariable()在堆中存的是成员变量 int i,int j,而int s 因为是类变量所以存在了方法区中
2、new TestVariable() 无参构造的时候实际上执行<init>()方法,因此非静态代码块会执行,这个再执行都是在栈中处理
{
int i = 1;
i++;
j++;
s++;
}
所以这里的i就是局部变量,i++ 结果=1 ,j根据就近原则指向的是堆中的obj 的j 因此 obj1,obj2指向堆中的j++ 等于1 ,方法区中的类变量++两次 这时候=2
3、obj1.test(10);实际执行代码如下
public void test(int j) { j++; i++; s++; }
这里的j是局部变量存在栈中,j++ 结果=11 ,i根据就近原则指向的是堆中的obj1的i,因此obj1指向堆中的i++等于1,方法区中的类变量++1次 这时候=3
4、obj1.test(20);执行代码如下
public void test(int j) { j++; i++; s++; }
这里的j是局部变量存在栈中,j++ 结果=21 ,i根据就近原则指向的是堆中的obj1的i,因此obj1指向堆中的i++等于2,方法区中的类变量++1次 这时候=4
5、obj2.test(30);
public void test(int j) { j++; i++; s++; }
这里的j是局部变量存在栈中,j++ 结果=31 ,i根据就近原则指向的是堆中的obj2的i,因此obj2指向堆中的i++等于1,方法区中的类变量++1次 这时候=5
每次执行完方法当前栈中的内存就会释放
因此最后结果是 2,1,5 和 1,1,5
原文:https://www.cnblogs.com/gyjx2016/p/12584489.html