我正在寻找一些老问题进行测试,但遇到一个很简单的问题,但这不是我期望的。

public class Exampractice {
  public static void f(int x, int[] y, int[] z) {
    x = 2;
    y[0] = x;
    z = new int[5];
    z[0] = 555;
  }
  public static void main(String[] args) {
    int x = 111;
    int[] y = {222, 333, 444, 555};
    int[] z = {666, 777, 888, 999};
    f(x, y, z);
    System.out.println(x);
    System.out.println(y[0]);
    System.out.println(z[0]);
  }
}


该问题询问以下代码的结果是什么。
我得到以下结果:

111
2
666


我知道为什么x是111,因为局部变量会覆盖所有其他变量,所以y [0] = 2,因为代码说它等于x,即2,但是我迷失了为什么z [0] = 666,因为它已在f中重新排列类。

最佳答案

在Java中,对象引用作为值传递。因此,当执行z = new int[5];时,z方法中存在的局部数组变量f()现在引用新创建的int数组,并且原始数组在其引用作为值传递给它时没有任何反应该方法被调用。

public static void f(int x, int[] y, int[] z) {
    x = 2;
    y[0] = x;
    // Till here z is referring to the int array passed from main method
    z = new int[5]; // now z is re-assigned with a new reference, the one of the newly created int array
    // thus the reference to the original array is no more being used here
    z[0] = 555; // this modifies the values of the newly created array
}


就个人而言,我总是建议阅读this answer by Eng.Fouad来理解这个概念。

08-03 16:45
查看更多