关于“按值传递”相关问题
在java的世界中,只有“按值传递”,不存在“按引用传递”。(这不同于c/c++,c/c++存在按值传递和按引用传递两种方式)
按值传递
按值传递意味着当将一个参数传递给一个方法时,方法接收的原始值的一个副本。
按引用传递
按引用传递意味着当将一个参数传递给一个方法时,方法接收到原始值的内存地址,而不是值的副本。
个人看法
其实,“内存地址”也是一个“值”,而这个“值”被叫作“引用”。
按值传递还是按引用传递的区别在于“是否在传递的时候进行对象的内存拷贝”,java中的基本数据类型在jvm中存储的区域不同于普通对象,所以传递前会拷贝,传递的是拷贝后的值;而对象在传递时不拷贝,直接传“地址”(引用),指向同一片对象堆内存区域。所以,就存在两种情况。
1、 两值交换,初始值不变(基本数据类型)
2、 两对象值交换,值改变(对象)
public static void swap ( int a, int b ) {
int temp;
temp = a;
a = b;
b = temp;
}
因为两个参数都是基本数据类型,所以传递前会进行拷贝,所以交换的是“副本”,而非原始数据,不会对原始数据造成影响。
public static void swap(Swap swap){
int temp;
temp = swap.num1;
swap.num1 = swap.num2;
swap.num2 = temp;
}
参数为对象,对象传递时不会进行拷贝,传递的是地址的“引用值”(指向同一片地址区域),当两个成员变量所在指向的地址发生交换时,成员变量对应的值也会发生改变,所以交换后会对对象中的成员变量的值造成影响。
//测试代码//
public static void main ( String[] args ) {
int a = 1, b = 2;
System.out.println ( "Before Swap -- a = " + a + " b = " + b );
swap ( a, b );
System.out.println ( "After Swap -- a = " + a + " b = " + b );
int num1 = 1,num2 = 2;
Swap s = new Swap ( num1,num2 );
System.out.println ( "Before Swap -- num1 = " + s.num1 + " num2 = " + s.num2);
swap ( s );
System.out.println ( "After Swap -- num1 = " + s.num1 + " num2 = " + s.num2 );
}
输出结果:
Before Swap -- a = 1 b = 2
After Swap -- a = 1 b = 2
Before Swap -- num1 = 1 num2 = 2
After Swap -- num1 = 2 num2 = 1
输出结果与分析的结果一样
遗留问题
如果将基本数据类型改成基本数据类型对应的封装对象,为什么不能得到与情况二一样的结果?