java只有值传递
在java中不管是基本数据类型,还是引用类型,都只是值传递!
1、基本数据类型
public class Demo {
public static void main(String[] args) {
int a = 10;
int b = 20;
exchange(a,b);
System.out.println("a:"+a+"\tb:"+b);
}
//实际传进去的是a,b的副本!,所以方法里不管怎么操作都不会影响原来a,b的值!
private static void exchange(int a, int b) {
int temp = a;
a = b;
b = temp;
System.out.println("a:"+a+"\tb:"+b);
}
}
控制台
a:20 b:10
a:10 b:20
2、引用类型
public class Data {
private int a;
private int b;
public static void main(String[] args) {
Data data = new Data();
data.a = 10;
data.b = 20;
exchange(data);//方法里面的data,一样的只是上面data引用变量的副本!
System.out.println("a:"+data.a+"\tb:"+data.b);
}
private static void exchange(Data dataCopy) {
//那为什么这里它可以改变对象的值,data是一个引用变量:保存了对象的地址值,dataCopy作为data的副本所以也有该地址值,当然也可以去操作对象了,但是data和dataCopy依旧是两个不同的变量!
dataCopy.a = 20;
}
}
控制台
a:20 b:20
copy:副本的意思!
为了证明data 和 dataCopy不是同一个变量,我把dataCopy赋值为null,假设data和dataCopy是同一个变量,那么执行①处的时候肯定会空指针异常的,如果没有异常也就证明它俩不是同一个变量!
注:其实这里的传值,传的就是地址值!
public class Data {
private int a;
private int b;
public static void main(String[] args) {
Data data = new Data();
data.a = 10;
data.b = 20;
exchange(data);//方法里面的data,一样的只是上面data引用变量的副本!
//①
System.out.println("a:"+data.a+"\tb:"+data.b);
}
private static void exchange(Data dataCopy) {
//为了dataCopy和main方法中的data不是同一个变量,我直接让它不再指向任何有效的地址
dataCopy = null;
}
}
控制台
a:10 b:20