Java中只有值传递
- 如果是基础类型如int,是复制了int的值给形参,形参的改变不影响实参。
public static void main(String[] args) {
int i = 10;
test(i);
System.out.println("print in main , i is " + i);
}
public static void test(int j) {
j = 20;
System.out.println("print in test, j is " + j);
}
结果:
print in test, j is 20
print in main, i is 10
- 如果是引用类型如String,是复制了字符串的引用给形参,直接修改形参也不影响实参
public static void main(String[] args) {
String name = "Shican";
test(name);
System.out.println("print in main , name is " + name);
}
public static void test(String name) {
name = "Xingcan";
System.out.println("print in test, name is " + name);
}
结果:
print in test, name is Xingcan
print in main , name is Shican
- 如果是引用类型如自定义的类对象,是复制了一份对象的地址给形参,如果直接修改形参则不影响实参
public static void main(String[] args) {
User shican= new User();
shican.setName("Shican");
test(shican);
System.out.println("print in main , user is " + shican);
}
public static void test(User user) {
user= new User();
user.setName("Xingcan");
System.out.println("print in test , user is " + user);
}
结果:
print in test , user is User{name=‘Xingcan’}
print in main, user is User{name=‘Shican’}
如果通过方法修改形参对象内的域则会影响到实参,但并不代表是引用传递,因为形参的值以及实参的值并没有改变,实际上还是值传递
public static void main(String[] args) {
User shican= new User();
shican.setName("Shican");
shican.setGender("Male");
test(shican);
System.out.println("print in main , user is " + shican);
}
public static void test(User user) {
user.setName("Xingcan");
System.out.println("print in test , user is " + user);
}
结果:
print in test , user is User{name=‘Xingcan’, gender=‘Male’}
print in main, user is User{name=‘Xingcan’, gender=‘Male’}