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

Java函数参数传递:引用传递、值传递的区别

发布时间:2023-06-04 18:43:12

在Java中,函数参数传递有两种方式:值传递和引用传递。两种方式在操作上的差异十分明显。本文将详细介绍Java中的参数传递方式,并说明它们之间的区别。

一、值传递

在Java中,值传递是一种函数参数传递的方式。值传递将参数的值复制一份,传递给函数。在函数内部对参数值的修改不会影响到函数外部对参数值的使用。例如下面的代码:

public class Test {
 public static void main(String[] args) {
  int x = 10;
  System.out.println("before function call, x = " + x);
  Test.inner(x);
  System.out.println("after function call, x = " + x);
 }
 public static void inner(int y){
  System.out.println("inside function, y = " + y);
  y = y + 1;
  System.out.println("after add 1, y = " + y);
 }
}

输出结果为:

before function call, x = 10
inside function, y = 10
after add 1, y = 11
after function call, x = 10

可以看到,内部函数对参数值进行了改变,但是在外部函数中参数值并没有改变。

值传递中的参数只有在传递时被复制一份,函数内部对参数值的任何操作都是在这个复制体上进行,不会影响到函数外部的原参数。

二、引用传递

在Java中,引用传递也是一种函数参数传递的方式。引用传递是将参数的地址传递给函数。在函数内部对参数值的修改会影响到函数外部对参数值的使用。例如下面的代码:

public class Test {
    private static class Student {
        private String name;
        private int 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 static void main(String[] args) {
        Student student = new Student();
        student.setName("Tom");
        student.setAge(20);
        System.out.println("before function call, student = " + student.getName() + " " + student.getAge());
        Test.inner(student);
        System.out.println("after function call, student = " + student.getName() + " " + student.getAge());
    }

    public static void inner(Student std) {
        System.out.println("inside function, student = " + std.getName() + " " + std.getAge());
        std.setAge(21);
        System.out.println("after set age to 21, student = " + std.getName() + " " + std.getAge());
    }
}

输出结果为:

before function call, student = Tom 20
inside function, student = Tom 20
after set age to 21, student = Tom 21
after function call, student = Tom 21

可以看到,内部函数对参数值进行了改变,而外部函数调用时,参数值也跟着改变了。

引用传递中的参数在传递时只是传递了它的地址,而函数内部对参数值的任何操作都是在这个地址上进行,会直接影响到函数外部的原参数。

三、值传递与引用传递的区别

值传递和引用传递在Java中操作上的差异十分明显,主要表现在以下几个方面:

1. 对于值传递,函数参数的修改不会影响函数外部对参数值的使用;而对于引用传递,函数参数的修改会影响函数外部对参数值的使用。

2. 对于值传递,在函数参数被传递时,只传递了参数的值的一个副本;而对于引用传递,在函数参数被传递时,传递的是参数的地址。

3. 对于值传递,函数内部任何对参数值的修改都是在副本上进行,不会影响到函数外部的原参数值;而对于引用传递,函数内部任何对参数值的修改都是在原地址上进行,会直接影响到函数外部的原参数值。

需要注意的是,Java中的所有类型都是通过引用进行操作的,包括原始类型。这意味着,当在函数内部修改原始类型参数时,虽然是值传递,但实际上它是通过该类型的引用进行操作的。当在函数内部修改对象类型参数时,则是对该对象在堆中的地址进行操作,因此是通过引用传递。