感觉网上说的很乱,又说只有按值传递的,还有说引用传递,其实不要纠结于概念,弄清楚原理才不会出错
其实无非有三种情况
public class Test {
private void test(int a){
a = 5;
System.out.println("test方法中的a="+a);
}
public static void main(String[] args) {
Test t = new Test();
int a = 3;
t.test(a);//传递后,test方法对变量值的改变不影响这里的a
System.out.println(”main方法中的a=”+a);
}
}
运行结果
test方法中的a=5
main方法中的a=3
要点:形参a 实参a 不是同一个对象 存放的在不同的地址单元 在test方法内的形参a对象 在方法结束后,销毁
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);
System.out.println(”main方法中的age=”+a.age);
}
}
class A{
public int age = 0;
}
结果:
test1方法中的age=20
main方法中的age=20
要点:因为test1方法传入的是对象的引用,即形参和实参 此时地址单元一致,因此在test1方法内部改变地址单元会对实参对应的引用对象造成改变
那么做如下修改后
public class TempTest {
private void test2(A a){
a = new A();//新加的一行
a.age = 20;
System.out.println("test2方法中的age="+a.age);
}
public static void main(String[] args) {
TempTest t = new TempTest();
A a = new A();
a.age = 10;
t.test2(a);
System.out.println(”main方法中的age=”+a.age);
}
}
class A{
public int age = 0;
}
结果:
test2方法中的age=20
main方法中的age=10
要点:test2方法内部 a = new A 此时a是一个新的对象,与实参a 是2个不同的地址单元,此时在test2内部改变形参a的地址单元对应的对象,不会对实参a造成影响
观察这三种情况的区别