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

Java函数参数传递的详解:值传递和引用传递

发布时间:2023-07-03 16:32:40

在Java中,函数参数传递可以分为值传递和引用传递两种方式。

值传递是指在函数调用时,将实际参数的值复制一份给形式参数,这样函数内部对形式参数的操作不会影响到实际参数。简单来说,就是通过值传递方式传递的参数,在函数内部对该参数的任何修改都不会影响到调用方。

例如:

public class ValueTransferDemo{
    public static void swap(int a, int b) {
        int temp = a;
        a = b;
        b = temp;
    }
    
    public static void main(String[] args) {
        int num1 = 10;
        int num2 = 20;
        
        swap(num1, num2);
        
        System.out.println("num1=" + num1); // 输出为10,未受到swap方法的影响
        System.out.println("num2=" + num2); // 输出为20,未受到swap方法的影响
    }   
}

在上述代码中,调用swap方法时,传递的是num1和num2的值,所以在swap方法内部对a和b进行交换并不会影响到num1和num2的值。

引用传递是指在函数调用时,将实际参数的地址传递给形式参数,形式参数在函数内部直接操作的是实际参数的内存空间。简单来说,就是通过引用传递方式传递的参数,在函数内部对该参数的修改会影响到调用方。

例如:

public class ReferenceTransferDemo{
    public static void changeName(Student student) {
        student.setName("Tom");
    }
    
    public static void main(String[] args) {
        Student stu = new Student("Jerry");
        
        changeName(stu);
        
        System.out.println(stu.getName()); // 输出为Tom,受到changeName方法的影响
    }   
}

class Student {
    private String name;
    
    public Student(String name) {
        this.name = name;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
}

在上述代码中,调用changeName方法时,传递的是stu对象的引用,所以在changeName方法内部对student对象的操作会改变stu对象的属性。

需要注意的是,Java中所有的基本类型(如int、float等)都是值传递,而对象类型(如String、自定义类等)则是引用传递。但是,对于对象类型,如果在函数内部对参数进行重新赋值,那么该参数将指向一个新的对象,这样会改变指向该对象的引用,但外部实际参数的引用不会受到影响。

总结起来,虽然Java中的参数传递可以通过值传递和引用传递两种方式进行,但在实际开发中我们常用的是引用传递,因为通过引用传递方式可以实现更加灵活且高效的操作。对于基本类型的参数,我们可以通过将其包装成对象来实现引用传递的效果。