静态变量:位于方法区。
实例变量:作为对象的一部分,保存在堆中。
临时变量:保存于栈中,栈随线程的创建而被分配。
栈内存中存放局部变量(基本数据类型和对象引用),而堆内存用于存放对象(实体)
对于字符串而言,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中;如果是运行期(new出来的)才能确定的就存储在堆中。
对于equals相等的字符串,在常量池中永远只有一份,在堆中可以有多份。
最后,借助网上看到的一个例子帮助对栈内存,堆内存的存储进行理解:
class BirthDate {
private int day;
private int month;
private int year;
public BirthDate(int d, int m, int y) {
day = d;
month = m;
year = y;
}
省略get,set方法………
}
public class Test{
public static void main(String args[]){
int date = 9;
Test test = new Test();
test.change(date);
BirthDate d1= new BirthDate(7,7,1970);
}
public void change1(int i){
i = 1234;
}
}
对于以上这段代码,date为局部变量,i,d,m,y都是形参为局部变量,day,month,year为成员变量。下面分析一下代码执行时候的变化:
- main方法开始执行:int date = 9;
date局部变量,基础类型,引用和值都存在栈中。 - Test test = new Test();
test为对象引用,存在栈中,对象(new Test())存在堆中。 - test.change(date);
调用change(int i)方法,i为局部变量,引用和值存在栈中。当方法change执行完成后,i就会从栈中消失。 - BirthDate d1= new BirthDate(7,7,1970);
调用BIrthDate类的构造函数生成对象。
d1为对象引用,存在栈中;
对象(new BirthDate())存在堆中;
其中d,m,y为局部变量存储在栈中,且它们的类型为基础类型,因此它们的数据也存储在栈中;
day,month,year为BirthDate对象的的成员变量,它们存储在堆中存储的new BirthDate()对象里面;
当BirthDate构造方法执行完之后,d,m,y将从栈中消失。
- main方法执行完之后。
date变量,test,d1引用将从栈中消失;
new Test(),new BirthDate()将等待垃圾回收器进行回收。
————————————————
版权声明:本文为CSDN博主「LaterEqualsNever」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ghost_Programmer/article/details/40891735