Java中的值传递机制
首先,我们先看下面一张图了解一下Java中的数据类型
然后记住以下两点:
- 如果变量是基本数据类型,则此时赋值的是变量的数据值
- 如果变量是引用数据类型,则此时赋值的是变量的地址值
接下来脑海里带着这两点来看下面的代码块,通过代码来理解
public class Test {
public void swap(int a, int b) {
int temp = a;
a = b;
b = tmp;
System.out.println("swap中的a:" + a + "==" + "b:" + b);//swap中的a:20==b:10
}
public static void main(String[] args) {
int a = 10;
int b = 20;
Test test = new Test();
test.swap(a, b);
System.out.println("main方法中的a:" + a + "==" + "b:" + b);//main方法中的a:10==b:20
}
}
从打印的数据可以得知变量a,b的值并没有发生改变,而方法调用时的实参传递的是变量的数据值;这符合我们第一点所说的,接下来看变量是引用数据类型的,同样通过代码来帮助我们理解。
public class Test {
class Data{
int a;
int b;
}
public static void main(String[] args) {
Test test = new Test();
test.start();
}
private void start() {
Data data = new Data();
data.a = 10;
data.b = 20;
System.out.println("数据交换前a:"+ data.a + " == b:" + data.b);//数据交换前a:10 == b:20
swap(data);
System.out.println("数据交换后a:"+ data.a + " == b:" + data.b);//数据交换后a:20 == b:10
}
private void swap(Data data) {
int temp = data.a;
data.a = data.b;
data.b = temp;
}
}
当数据传递的是引用数据类型的时候,传递的是它保存数据的地址值,也就是当变量是引用类型的时候,赋值是赋它的地址值。
注意
看下面代码块
public class Test {
public static void main(String[] args) {
String str = "a";
Test test = new Test();
test.swap(str);
System.out.println("main方法中的"+str);//main方法中的str:a
}
private void swap(String str) {
str = "b";
System.out.println("swap方法中的"+str);//swap方法中的str:b
}
}
可以知道的是String是引用数据类型,但我们发现变量的值并没有发生改变,是不是说明传的不是变量的地址值?
String是一个字符串常量,也就是它的值是不可变的,当我们把值传过去的时候,传的确实是它的地址值,这时他们指向同一个地址,而当给它赋以新值的时候,它会重新创建一个新的char[],再把新的地址值赋给变量,此时也就指向了两个不同的地址,因此值也不相同。