Java中只有值传递,没有引用传递
- 值传递:是指在调用函数时,将实际参数复制一份传递给函数,这样在函数中修改参数时,不会影响到实际参数。其实,就是在说值传递时,只会改变形参,不会改变实参。
- 引用传递:是指在调用函数时,将实际参数的地址传递给函数,这样在函数中对参数的修改,将影响到实际参数。
1、传递参数是基本类型时
public class TestNum {
public static void main(String[] args) {
int num = 3;
System.out.println("修改前的num值:"+num);
changeValue(num);
System.out.println("修改后的num值:"+num);
}
private static void changeValue(int num) {
num = 5;
System.out.println("形参num值:"+num);
}
}
可以发现,传递基本数据类型时,在函数中修改的仅仅是形参,对实参的值的没有影响
需要明白一点,值传递不是简单的把实参传递给形参,而是,实参建立了一个副本,然后把副本传递给了形参。
2、传递参数是引用类型时
首先准备一个Person类
public class Person{
private int age;
private String name;
public Person(){}
public Person(int age, String name) {
this.age = age;
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "Person{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
2.1 引用对象的指向未发生变化
public class TestClass {
public static void main(String[] args) {
Person person = new Person(18, "luosanliang");
System.out.println("对象修改前:" + person);
changePerson(person);
System.out.println("对象修改后:" + person);
}
public static void changePerson(Person person){
person.setAge(20);
person.setName("java");
}
}
问题:发现当传递的变量变为引用变量时,方法中形参的修改导致实参也发生了修改
原因:Java当中,对象存放在堆中, 其引用存放在栈中。当实参创建副本传递给形参时,它们实际操作的都是堆内存中的同一个对象
2.2 引用对象的指向发生变化
public class TestClass {
public static void main(String[] args) {
Person person = new Person(18, "luosanliang");
System.out.println("对象修改前:" + person);
changePerson(person);
System.out.println("对象修改后:" + person);
}
public static void changePerson(Person person){
// ** 注意:此处重新实例化了一个对象
person = new Person();
person.setAge(20);
person.setName("java");
}
}
问题:发现此时代码的结果与** 2.1 **并不相同
原因:形参在方法中重新实例化了一个对象,person = new Person()
此时实参与形参指向的并不是同一个堆内存