基本数据类型的值存放在哪里

备注:这里只针对基本数据类型做讨论(int long double float char byte boolean short)

基本数据类型的值,到底存放在哪?

这取决于它声明在哪,它只会声明在三个位置

  1. 类变量
  2. 成员变量
  3. 局部变量
public class Test {
    public static int a = 1;// 类变量
    public int b = 2;// 成员变量
    public void method() {
        int c = 3;// 局部变量
        int d = 3;// 局部变量
        c = 4;
    }
}
  1. 类变量:随着类加载的初始化,把值(a=1中的1)存放在中,该类所有对象共用

类加载分为加载、验证、准备、解析、初始化五个阶段,准备时,在堆中分配内存,解析时,把a对应的符号引用转换成直接引用(堆中的内存地址),初始化时,把值1存到该地址中

  1. 成员变量:随着对象的创建,也是把值(b=2中的2)存放在中,每个对象私有
  2. 局部变量:运行时,随着方法的入栈,而创建在中,随着方法的出栈而消亡

总结:除了局部变量存放在栈中,其它变量都在堆中

另外,局部变量有一个很重要的特殊性,就是存于栈的数据可以共享

如上例中的int c = 3; int d = 3; c = 4;,分析如下:

  1. 编译器先处理int c = 3;首先它会在栈中创建一个变量为c的引用,然后查找有没有字面值为3的地址,没找到,就开辟一个存放3这个字面值的地址,然后将c指向3的地址。
  2. 接着处理int d = 3;在创建完b这个引用变量后,由于在栈中已经有3这个字面值,便将d直接指向3的地址。这样,就出现了c与d同时均指向3的情况。

c = 4;时,d不会等于4,还是等于3

  1. 在编译器内部,遇到时,它就会重新搜索栈中是否有4的字面值,如果没有,重新开辟地址存放4的值
  2. 如果已经有了,则直接将c指向这个地址。因此c值的改变不会影响到d的值。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值