java值传递与引用传递
1、按值传递是什么
传递的是值的拷贝,也就是说传递后就互不相关了(基本数据类型和String都是这样)。
public class Test {
private void test(int a){
a = 5;
System.out.println("test方法中的a==="+a);
}
public static void main(String[] args) {
TempTest t = new TempTest();
int a = 3;
t.test(a);//传递后,test方法对变量值的改变不影响这里的a
System.out.println(”main方法中的a===”+a);
}
}
运行结果是:test方法中的a===5 main方法中的a===3
2、按引用传递是什么
在方法调用时,传递前和传递后都指向同一个引用(也就是同一个内存空间)。
public class TempTest {
private void test1(A a){
a.age = 20;
System.out.println("test1方法中的age="+a.age);
}
public static void main(String[] args) {
TempTest t = new TempTest();
A a = new A();
a.age=10;
t.test1(a); //这里传递的参数a就是按引用传递
System.out.println(”main方法中的age=”+a.age);
}
}
class A{
public int age = 0;
}
运行结果如下:test1方法中的age=20 main方法中的age=20
3、解释
值传递:针对基本类型
方法调用时,实际参数把它的值传递给对应的形式参数,函数接收的是原始值的一个copy,此时内存中存在两个相等的基本类型,即实际参数和形式参数,后面方法中的操作都是对形参这个值的修改,不影响实际参数的值。
String表现为值传递,主要是因为String是不可变的!如何理解不可变?我们一般说的改变一个String变量,其实并不是改变的这个String本身,而是用一个新的String去替换掉原来的,原来的String本身并没有变。
String str1 = "old";
str1 = "new";//不是在原内存地址上修改数据,而是重新指向一个新对象,新地址。
//对String对象的任何改变都不影响到原对象,相关的任何操作都会生成新的对象
引用传递:
方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,函数接收的是原始值的内存地址;在方法执行中,形参和实参内容相同,指向同一块内存地址,方法执行中对引用的操作将会影响到实际对象。