java各个变量都存储在哪了? 您所在的位置:网站首页 静态变量存放位置 java各个变量都存储在哪了?

java各个变量都存储在哪了?

2024-07-16 16:45| 来源: 网络整理| 查看: 265

静态变量:位于方法区。

实例变量:作为对象的一部分,保存在堆中。

临时变量:保存于栈中,栈随线程的创建而被分配。

栈内存中存放局部变量(基本数据类型和对象引用),而堆内存用于存放对象(实体)

对于字符串而言,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中;如果是运行期(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



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有