重走Java基础——(3)JVM内存分析之基本数据类型的值传递及引用类型的地址传递
重走Java基础——(3)JVM内存分析之基本数据类型的值传递及引用类型的地址传递
基本数据类型的值传递
package lee;
public class Method {
static void change(int x){
System.out.println("第一次x的值:"+x);
x = 100;
System.out.println("第二次x的值:"+x);
}
public static void main(String[] args) {
int x = 20;
change(x);
System.out.println("第三次x的值:"+x);
}
}
输出结果为:
第一次x的值:20
第二次x的值:100
第三次x的值:20
-
结果表明x的值不会发生改变。
-
以下为值传递的内存变化过程图:
-
对上图的解释:
-
1、首先执行
main
方法,创建一个main方法的栈帧,该栈帧中包含int x = 20;
,将该栈帧入栈。 -
2、之后运行
change()
方法,该方法会创建一个change()
的栈帧,改栈帧包含了int x
,之后对int x
赋值,使其等于int x = 20;int x=100
,此时的操作都在change()
方法栈帧中进行操作,并不会影响main()
方法栈帧中的int x
的值; -
3、
change()
方法运行结束后,由于栈的先进后出原则,change()
方法的栈帧出栈,此时只剩下main()
方法的栈帧还在栈中,因此此时打印的是main()
方法栈帧中的int x
的值,其值为20. -
既:
引用类型的地址传递
package lee;
public class Method {
static void swap(int[] nums){
int temp =nums[0];
nums[0] = nums[1];
nums[1] = temp;
System.out.println("num={" +nums[0]+","+nums[1]+"}");
}
public static void main(String[] args) {
int [] nums = new int[]{10,20}
System.out.println("num={" +nums[0]+","+nums[1]+"}");
swap(nums);
System.out.println("num={" +nums[0]+","+nums[1]+"}");
}
}
输出结果为:
nums = {10,20}
nums = {20,10}
nums = {20,10}
- 结果表明nums的值会发生改变。
- 以下为地址的内存变化过程图:
- 因此nums发生变化.
基本数据类型的值传递和引用类型的地址传递的本质区别
- 值传递:基本数据类的在方法中参数的使用属于值传递。由于基本数据类型的初始化都在栈中发生。不同方法体的栈帧是分离的,因此实际上某个方法对其基本类型的参数变量的改变只会发生在自身的栈帧中,不会影响其它方法体中的变量的值。
- 地址传递:某个方法的中的引用变量作为其它方法的参数变量时,使用的是地址传递。由于引用变量的值是指向该对象的地址,一旦其它方法应用该地址对其对象进行修改时也会影响改变量本身。