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

Java中的函数参数传递(传值与传引用)

发布时间:2023-06-16 23:55:18

在Java中,函数参数传递是通过值传递方法来实现的。这意味着当我们调用一个函数时,我们传递给函数的是该对象的一个副本而不是对象本身。这个副本称为函数参数。

传值:

在Java中,当我们传递一个基本类型的数据(如int,double等)时,我们实际上是传递该变量的副本。这意味着在函数中对该参数的任何修改都不会影响原始变量的值。

例如:

public static void main(String[] args) {
  int a = 10;
  add(a);
  System.out.println("a: " + a);
}

public static void add(int b) {
  b = b + 5;
}

上述代码中,我们定义了一个变量a,并在函数add中将其增加了5。然而,当我们在main函数中打印a时,我们会发现其值仍为10而不是15。这是因为在函数中修改b对a没有任何影响。

传引用:

当我们传递一个对象作为参数时,我们实际上传递的是该对象的引用。这意味着我们实际上传递的是该对象在内存中的地址,而不是对象本身。因此,当我们在函数中修改该对象的属性时,原始对象的属性也会发生改变。

例如:

public static void main(String[] args) {
  List<Integer> list = new ArrayList<>();
  list.add(1);
  list.add(2);
  list.add(3);
  addOne(list);
  System.out.println("List: " + list);
}

public static void addOne(List<Integer> myList) {
  for (int i = 0; i < myList.size(); i++) {
    myList.set(i, myList.get(i) + 1);
  }
}

上述代码中,我们在main函数中定义了一个List对象,并通过函数addOne将其中的所有元素都加1。当我们打印list时,我们会发现其所有元素都增加了1。这是因为我们传递了一个指向list的引用,而不是传递了list的副本。

需要注意的是,虽然我们传递了对象的引用,但是我们不能在函数中更改该对象的引用。例如,我们不能在函数中将参数对象指向另一个对象。

例如:

public static void main(String[] args) {
  List<Integer> list = new ArrayList<>();
  list.add(1);
  list.add(2);
  list.add(3);
  swapList(list, new ArrayList<>());
  System.out.println("List: " + list);
}

public static void swapList(List<Integer> list1, List<Integer> list2) {
  List<Integer> temp = list1;
  list1 = list2;
  list2 = temp;
}

在上述代码中,我们定义了一个交换函数swapList,它接受两个List对象作为参数,并将它们的引用交换。然而,当我们在main函数中打印list时,我们会发现其值并没有改变。这是因为在函数中我们只是交换了指向对象的引用,而并没有交换对象本身。因此,我们不能在函数中更改传递的引用。