如何在Java中引用传递参数和值传递参数
Java是一门面向对象的编程语言,它是一种强类型语言,因此在Java中想要传递参数,需要对参数类型进行明确的定义。在Java中,参数传递有两种方式,一种是引用传递,一种是值传递。
1. 引用传递
当我们要在一个方法中使用对象时,实际上是使用该对象的引用(地址),这时候,我们可以通过该引用来修改该对象的属性或调用该对象的方法。这就是Java中的引用传递。
我们来看一个例子:
public class User {
private int age;
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
public class Test {
public static void main(String[] args) {
User user = new User();
user.setAge(20);
changeUser(user);
System.out.println(user.getAge());
}
public static void changeUser(User user) {
user.setAge(30);
}
}
运行上面的程序,结果为:
30
我们发现,通过changeUser方法中的user对象,我们修改了user的age属性为30,并最终输出了修改后的值。
这里需要注意的是,在Java中,虽然我们可以通过引用修改对象的属性,但我们无法修改引用本身指向的对象。也就是说,方法中修改参数对象指向的另一个对象,不会对原对象造成任何影响。
public class User {
private int age;
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
public class Test {
public static void main(String[] args) {
User user1 = new User();
user1.setAge(20);
User user2 = new User();
user2.setAge(30);
swapUser(user1, user2);
System.out.println("user1 age:"+user1.getAge()+" user2 age:"+user2.getAge());
}
public static void swapUser(User user1, User user2) {
User tempUser = user1;
user1 = user2;
user2 = tempUser;
}
}
运行上面的程序,结果为:
user1 age:20 user2 age:30
我们发现,虽然在swapUser方法中改变了user1和user2的指向关系,但在main方法中,原来的引用并没有改变,仍然指向原来的对象。
2. 值传递
值传递是指将方法外的变量值传递给方法内部的形参,方法内部的形参对它的改变不会影响到原变量的值。Java中,基本类型的参数传递是值传递。
我们来看一个例子:
public class Test {
public static void main(String[] args) {
int num = 10;
changeNum(num);
System.out.println(num);
}
public static void changeNum(int num) {
num = 20;
}
}
运行上面的程序,结果为:
10
我们发现,在changeNum方法中虽然改变了num的值,但并不影响原变量num的值。
需要注意的是,如果传递的是一个对象类型的变量,虽然对象本身是引用类型,但在方法内部对对象作出的改变会影响到原对象的值。这是因为对象本身是在堆内存中存放的,而对象的引用是在栈内存中存放的。
public class User {
private int age;
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
public class Test {
public static void main(String[] args) {
User user = new User();
user.setAge(20);
changeUserAge(user);
System.out.println("user age:"+user.getAge());
}
public static void changeUserAge(User user) {
user.setAge(30);
}
}
运行上面的程序,结果为:
user age:30
我们发现,在changeUserAge方法中改变了user对象的年龄属性,但在main方法中输出的对象年龄属性也发生了改变。
结论
在Java中,基本类型是值传递,而对象类型是引用传递。引用传递可以对对象的属性进行改变,但无法改变对象引用指向的对象。值传递也可以对对象作出改变,但无法改变原对象的引用指向的对象。
