欢迎访问宙启技术站
智能推送

Java函数中的引用传递与值传递

发布时间:2023-06-11 19:21:58

Java中的函数传递参数有两种方式:引用传递和值传递。这两种方式在使用中有着不同的特点和使用场景。下面我们就来分析一下引用传递和值传递的区别和使用。

1.值传递(传递基本数据类型)

在方法调用中,如果一个方法需要的参数是一个基本数据类型,这种参数传递方式就是值传递。例如:

public void changeInt(int i) {
    i = 20;
}
int i = 10;
changeInt(i);
System.out.println(i); //输出结果为:10

在上述代码中,我们定义了一个方法changeInt(),该方法需要一个int类型的参数i。在主程序中,我们定义了一个整型变量i,并将其赋初始值为10。然后我们调用changeInt()方法,并将变量i作为参数传入该方法中。在方法内部,我们再将参数i的值修改为20。

但是在方法调用结束后,我们再次打印i的值,却发现其值还是10,没有被改变。

这是因为在实际操作中,Java采用了值传递方式,在传递参数时,实际上传递的是值的一个拷贝,而不是原值本身,所以即使在函数内部修改传入参数的值,仍然不会影响原来变量的值。

2.引用传递(传递对象类型)

在Java中,除了基本数据类型之外,还有对象类型,例如String、数组等,这些数据类型传递参数时使用的是引用传递。例如:

public void changeString(String s) {
    s = "world";
}
String s = "hello";
changeString(s);
System.out.println(s); //输出结果为:hello

在上述代码中,我们定义了一个方法changeString(),该方法需要一个String类型的参数s。在主程序中,我们定义了一个字符串变量s,并将其赋初始值为"hello"。然后我们调用changeString()方法,并将变量s作为参数传入该方法中。在方法内部,我们再将参数s的值修改为"world"。

但是在方法调用结束后,我们再次打印s的值,却发现其值还是"hello",没有被改变。这也说明了对象类型参数传递时采用了引用传递方式。

在引用传递中,传递的是对象的地址,而不是对象本身。方法中对对象属性的修改,会影响到该对象本身的属性值,因此方法执行完后,原对象的属性值也随之改变。

例如:

class Person {
    private int age;
    public Person(int age) {
        this.age = age;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}
public void changeAge(Person person) {
    person.setAge(20);
}
Person person = new Person(10);
changeAge(person);
System.out.println(person.getAge()); //输出结果为:20

在上述代码中,我们定义了一个类Person,并定义了一个属性age。然后我们定义了一个方法changeAge(),该方法需要一个Person类型的参数person。在主程序中,我们创建了一个Person类的实例person,并将其age赋初值为10。然后我们调用changeAge()方法,并将变量person作为参数传入该方法中。

在方法内部,我们对传入的person对象进行setAge()操作,将其age值修改为20。方法结束后,我们再次通过getAge()方法访问该对象的age值,发现其值为20,说明方法对传入的对象进行了修改。

在实际编程中,我们需要根据场景选择不同的参数传递方式,以达到最佳的效果。总的来说,如果需要修改原始对象的属性值,可以选择引用传递;如果不需要修改原始对象的属性值,以及操作的是基本数据类型,则应该使用值传递。