Java中并不存在引用调用,方法得到的参数值只是一个拷贝,方法并不能修改传递给它的任何参数变量的内容。
例子说明:
public class test {
public static void main(String[] args) {
// TODO Auto-generated method stub
int num=1;
System.out.println("调用前:"+num);
change(num); // num 没有被改变
System.out.println("调用后:"+num);
}
public static void change(int value) {
value = 100;
}
}
运行结果:
调用前:1
调用后:1
解析:参数value得到的值是num的副本,调用change方法,改变value的值为100,不影响num的值。
例子说明:
public class test {
public static void main(String[] args) {
int num1 = 10;
int num2 = 20;
swap(num1, num2);
System.out.println("num1 = " + num1);
System.out.println("num2 = " + num2);
}
public static void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
System.out.println("a = " + a);
System.out.println("b = " + b);
}
}
运行结果:
a = 20
b = 10
num1 = 10
num2 = 20
解析:调用swap方法,将num1和num2的值复制一份给a和b,a、b的值进行交换,并不会影响到num1、num2。
也就是说,a、b相当于num1、num2的副本,副本的内容无论怎么修改,都不会影响到原件本身。
结论:当方法参数类型为基本数据类型(数字以及布尔值)时,一个方法是不可能修改一个基本数据类型的参数。
那么对于引用类型?
public class test {
private static User user=null;
public static void updateUser(User student){
student.setName("Lishen");
student.setAge(18);
}
public static void main(String[] args) {
user = new User("zhangsan",26);
System.out.println("调用前user的值:"+user.toString());
updateUser(user);
System.out.println("调用后user的值:"+user.toString());
}
}
class User {
private String name;
private int age;
public User(String name, int age) {
this.name=name;
this.age=age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString() {
return name+" "+age;
}
}
运行结果:
调用前user的值:zhangsan 26
调用后user的值:Lishen 18
结论:当传递方法参数类型为引用数据类型时,一个方法将修改一个引用数据类型的参数所指向对象的值。
但String这个类有点特殊
例子说明:
public class test {
public static void main(String[] args) {
String s1="1";
System.out.println("之前:"+s1);
change(s1);
System.out.println("之后:"+s1);
}
public static void change(String string) {
string="2";
}
}
运行结果:
之前:1
之后:1
String不是引用类型吗,为什么值没有改变?
因为String的值在创建之后不能被更改,对String对象str的任何修改等同于重新创建一个对象,并将新的地址值赋值给str。
解析:调用change方法,将s1的地址值,复制一份给string,
change方法中,重新创建了一个String对象"2",并将string指向了新的地址值,不影响s1。
总结:java函数在传递引用数据类型时,也只是拷贝了引用的值罢了,之所以能修改引用数据是因为它们同时指向了一个对象,但这仍然是按值调用而不是引用调用。