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

Java函数的参数传递方法有哪些?

发布时间:2023-06-17 02:39:01

Java函数的参数传递是指在调用函数时将所需数据传递给函数的过程。Java中有三种参数传递方式:值传递、引用传递和引用传递的副本机制。

1. 值传递

值传递是指传递的参数是基本数据类型。在调用函数时,实际参数的值被复制给形式参数,即在函数内部操作的是一个副本。修改这个副本不会影响到原始值。当函数执行结束时,这个副本也会被销毁。示例代码如下:

public class Test {
   public static void main(String[] args) {
      int a = 100;
      int b = 200;
      System.out.println("交换前:a=" + a + ",b=" + b);
      swap(a, b);
      System.out.println("交换后:a=" + a + ",b=" + b);
   }
   public static void swap(int num1, int num2) {
      int tmp = num1;
      num1 = num2;
      num2 = tmp;
   }
}

执行结果如下:

交换前:a=100,b=200
交换后:a=100,b=200

可以看出,原始的a和b的值并没有被交换。

2. 引用传递

引用传递是指传递的参数是引用类型。在调用函数时,实际参数的引用(内存地址)被复制给了形式参数,即在函数内部操作的是原始数据的引用。这意味着当在函数中修改了参数的值时,也会影响到原始值。示例代码如下:

public class Test {
   public static void main(String[] args) {
      int[] arr = new int[]{1, 2, 3};
      System.out.println("修改前的值为:" + Arrays.toString(arr));
      modify(arr);
      System.out.println("修改后的值为:" + Arrays.toString(arr));
   }
   public static void modify(int[] arr) {
      arr[0] = 10;
      arr[1] = 20;
      arr[2] = 30;
   }
}

执行结果如下:

修改前的值为:[1, 2, 3]
修改后的值为:[10, 20, 30]

可以看出,在函数内部修改了arr的值,原始数组也随之改变。

3. 引用传递的副本机制

引用传递的副本机制是指传递的参数是引用类型,但是在函数内部创建了该参数的副本,然后对副本进行操作。这意味着虽然引用被复制了,但是原本的数据并没有被修改。这种传递方式是为了防止不小心修改了原始值而引起的问题。示例代码如下:

public class Test {
   public static void main(String[] args) {
      Person p = new Person("小明", 20);
      System.out.println("修改前的值为:" + p.toString());
      changeAge(p);
      System.out.println("修改后的值为:" + p.toString());
   }
   public static void changeAge(Person p) {
      p = new Person(p.getName(), 30);
   }
}
class Person {
   private String name;
   private int age;
   public Person(String name, int age) {
      this.name = name;
      this.age = 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;
   }
   @Override
   public String toString() {
      return "Name: " + name + ", Age: " + age;
   }
}

执行结果如下:

修改前的值为:Name: 小明, Age: 20
修改后的值为:Name: 小明, Age: 20

可以看出,在函数内部修改了传递进来的Person对象的副本,而原始的Person对象并没有被修改。