值传递和引用传递
值(基本数据类型) → 在栈内存中
引用(对象) → 在堆内存中
/**
* 值传递和引用传递的区别
* 值传递(值是基本数据类型)
* 引用传递(引用是对象)
*/
public class ParamTest {
/**
* 值传递(传到方法中的数值已经和原数据没有任何的联系)
* @param n
*/
public static void test1(int n){
n=2;//方法中改变了n保存的值,猜测和外部的变量n是否有联系?
System.out.println("方法中n = " + n);
}
/**
* 引用传递(传到方法中的对象和原对象仍然有联系!!!)
* @param arr
*/
public static void test2(int[]arr){
arr[0]=100;//改变数组对象0下标的元素
System.out.println("方法中arr = " + Arrays.toString(arr));
}
public static void main(String[] args) {
//值传递测试
int n = 1;
test1(n);
System.out.println("外部n = " + n);
//引用传递测试
int[]arr={1,2};
test2(arr);
System.out.println("外部arr = " + Arrays.toString(arr));
}
}
问题:当我们传参的时候,传出去的数据是否还和原本的变量有关系?
列:
int[]brr = {100};
int[]crr = brr;
int[]drr = brr;
这三个数组变量指向同一个数组对象,任何一个改变,其实改变的是同一个数组对象
//把对象在堆内存的首地址(位置)保存给不同的变量
int[]brr = {100};
int[]crr = brr;
int[]drr = brr;
//请问:brr、crr、drr,一共几个数组?
// 1个(三个变量保存的是同一个对象的地址,表示的是同一个数组对象)
//改变crr变量保存的数组对象的元素,另外两个变量也跟着改变
System.out.println("brr[0] = " + brr[0]);//200
System.out.println("crr[0] = " + crr[0]);//200
System.out.println("drr[0] = " + drr[0]);//200