基本数据类型:传递的是值的副本,修改副本不会对原值造成影响,也就是值传递
(Byte,Short,Integer,Long,Float,Double,Boolean,Character)
引用数据类型(除开基本数据类型的所有数据类型):传递的是对象的引用,如果通过引用2修改对象1,则会导致对象1的改变,而用引用1查询出来的对象1也随之改变。
基本数据类型
int i = 0;
int a = i;
通过"javap -c xxx.class"将代码反编译,生成结果如下
分析
0: iconst_0 0入栈,将0放到栈的顶部。
1: istore_1 将0从栈顶弹出,保存到局部变量表(局部变量表也是虚拟机栈的一部分)index为1的位置。
2: iload_1 将局部变量表index为1的值的副本放到栈的顶部。
3: istore_2 将栈顶的值弹出,放到局部变量表的index为2的位置。
4: return
这时候局部变量表中index=1的位置和index=2的位置分别存了一个0,修改i或者a不会对对方造成影响
引用数据类型
跟上面类似,但i和a都是指向同一个对象,此时通过i修改值会导致a的值也改变。(注意:引用数据类型在内存中的存储跟上面的不同)
顺便写下分别存储位置
局部变量 | 成员变量 | |
---|---|---|
基本数据类型 | 变量名与值都存在局部变量表中(虚拟机栈的一部分) | 变量名和值都在堆内存中 |
引用数据类型 | 引用在局部变量表中,对象在堆内存中 | 引用与对象都在堆内存中 |