java学习-值传递和地址传递
java的面向对象中学到了值传递和地址传递,由于这个知识多次搞错,在此记录一下。
值传递和地址传递:
如果变量是基本数据类型,此时赋值的是变量所保存的数据值。
如果变量是引用数据类型(例如数组,对象),此时赋值的是变量所保存的数据的地址值。
内存分析:
代码测试
class Data {
int a;
int b;
}
public class valueTrans {
public static void main(String[] args) {
//测试值传递
int m = 10;
int n = 20;
/*就基本数据类型交换两个值时,就用这种方法,不能用调用swap方法那样,因为那样值传递导致交换不了
int tmp = m;
m = n;
n = tmp;
System.out.println("m = " + m + "n = " + n);// m = 20,n = 10,能够正常交换
*/
swap1(m , n);
System.out.println("m = " + m + " , n = " + n);//m = 10, n = 20,不能交换成功,因为只是值传递了
//测试地址传递,引用数据类型是对象
Data data = new Data();
data.a = 10;
data.b = 20;
swap2(data);
System.out.println("a = " + data.a + " , b = " + data.b);//a = 20, b = 10;交换成功,微微data是对象,是引用数据类型,传递的是地址
/*测试地址传递,引用数据类型是地址,冒泡排序,这样是正确的
int[] arr = new int[]{1,3,2,9,5};
for(int i = 0; i < arr.length - 1;i++){
for(int j = 0;j < arr.length - 1 - i;j++){
if(arr[j+1] > arr[j]) {
int tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
for(int i = 0;i < arr.length;i++) // 9 5 3 2 1
System.out.print(arr[i] + " ");
*/
int[] arr = new int[]{1,3,2,9,5};
for(int i = 0; i < arr.length - 1;i++){
for(int j = 0;j < arr.length - 1 - i;j++){
if(arr[j+1] > arr[j]) {
swap1(arr[j],arr[j+1]);//不能交换,因为传入的是基本数据类型,传递的是值
//swap3(arr, j, j+1);//能交换,因为传入了数组,传递的是地址
}
}
}
for(int i = 0;i < arr.length;i++)
System.out.print(arr[i] + " ");
}
public static void swap1(int m, int n){
int tmp = m;
m = n;
n = tmp;
}
private static void swap2(Data data) {
int tmp = data.a;
data.a = data.b;
data.b = tmp;
}
public static void swap3(int[] arr, int i, int j){
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}