1 什么是值传递、引用传递
值传递和引用传递之前的区别到底是什么?
两者的最主要区别就是是直接传递的,还是传递的是一个副本。
1.1 代码示例
发现a、b、c、d、e的值并没有交换,为什么呢?
String使用final修饰的int进行存储,swap将a重新赋值,此时堆中已新建了一个地址,值为”abc”,当获取main方法中的a时,自然获取的main方法是a地址里面的”a”。
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
b、c因为Java中采用的是值传递,也就是说执行swap(int b, int c)时,这里的参数b和c,只是b和c的副本,函数的运行结果并没有改变原来b和c的值。
Integer使用final修饰的int进行存储:
public final class Integer extends Number implements Comparable<Integer> {
......
}
final修饰的变量不能被重新赋值,所以操作参数传递变量时,实际上是操作变量对象的副本(Java中的包装类型都是默认使用这种方式实现的,使用拷贝副本的方式提升效率和减少内存消耗)。另外d、e地址不一样也能说明问题。
1.2 什么是引用变量
变量的实质是一小块内存单元。这一小块内存里存储着变量的值比如int a = 1;a就是变量的名,1就是变量的值。
而当变量指向一个对象时,这个变量就被称为引用变量比如A a =new A();a就是引用变量,它指向了一个A对象,也可以说它引用了一个A对象。我们通过操纵这个a来操作A对象。 此时,变量a的值为它所引用对象的地址。
其实引用类型在传递的时候也是把”值”复制一份传递过去 , 只不过这个值是引用变量的值(也就是对象所在的内存地址) , 并非值本身。