java是值传递还是引用传递
值传递
是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数
引用传递
是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数
情况一:
- 基本数据类型:
public class TestJavaPass {
public static void main(String[] args) {
TestJavaPass tj = new TestJavaPass();
int i=10;
tj.pass(i);
System.out.println("print in main, i is "+i);
}
public void pass(int j){
j=20;
System.out.println("print in pass, j is "+j);
}
}
- 结果
print in pass, j is 20
print in main, i is 10
-
结论
传入基本数据类型时,为值传递不会改变其本身
情况二:
-
传入对象并改变其自身属性
public class TestJavaPass { public static void main(String[] args) { TestJavaPass tj = new TestJavaPass(); // int i=10; // tj.pass(i); // System.out.println("print in main, i is "+i); User user = new User(); user.setName("hollis"); user.setGender("Male"); tj.pass(user); System.out.println("print in main , user is "+user); } public void pass(int j){ j=20; System.out.println("print in pass, j is "+j); } public void pass(User user){ user.setName("hollischuang"); System.out.println("print in pass , user is "+user); } }
-
结果
print in pass , user is User{name='hollischuang', gender='Male'} print in main , user is User{name='hollischuang', gender='Male'}
-
结论
传入为引用类型时,对象的属性改变
情况三:
-
传入对象的引用,不改变对象的属性
public class TestJavaPass { public static void main(String[] args) { TestJavaPass tj = new TestJavaPass(); // int i=10; // tj.pass(i); // System.out.println("print in main, i is "+i); User user = new User(); user.setName("hollis"); user.setGender("Male"); tj.pass(user); System.out.println("print in main , user is "+user); } public void pass(int j){ j=20; System.out.println("print in pass, j is "+j); } public void pass(User user){ user = new User(); user.setName("hollischuang"); System.out.println("print in pass , user is "+user); } }
-
结果
print in pass , user is User{name='hollischuang', gender='null'} print in main , user is User{name='hollis', gender='Male'}
-
结论
方法pass中形参user首先指向main方法中的user,然后再新建user类的时候会重新指向新建的user,后续改变新建user,main方法中的user并未改变,这里是值传递,传递的是对象的引用
结论:
java是值传递,基本数据类型传递复制的对象,引用数据类型传递其引用,如果在方法中提供了修改引用对象的方法则会修改其对象,否则不会修改