JAVA可变范围

时间:2014-04-03 10:46:53

标签: java

我正在查看一些旧问题进行测试,但我遇到了一个非常简单的问题,但这并不是我的预期。

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班。

5 个答案:

答案 0 :(得分:6)

在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来理解这个概念。

答案 1 :(得分:1)

因为您正在使用创建新对象的new

答案 2 :(得分:1)

重要的是值或引用是否设置为变量

x有值

    x=111

    y and z
    points two different arrays

y和z没有值,它有一个数组的引用

    reference y[0] is edited globally  in f

    z is recreated in the method f locally using "new" 

它不影响方法main()中的原始对象,所以我们得到了那个结果。

答案 3 :(得分:0)

该方法创建一个新的int数组。方法退出后旧的完整。

答案 4 :(得分:0)

Z是一个新对象,函数中的z实际上是this.z