2013-05-09 56 views
1

我正在评估一个练习题,我只是想知道程序如何得出答案---> 2 1 我很难理解主要驱动程序呼叫。我了解这些方法的用法。需要帮助了解程序执行情况

的代码是:

public class Test { 
    public static void main(String[] args) { 
    int[] x = {1, 2, 3, 4, 5}; 
    increase(x); 

    int[] y = {1, 2, 3, 4, 5}; 
    increase(y[0]); 
    System.out.println(x[0] + " " + y[0]); 
    } 
    public static void increase(int[] x) { 
    for (int i = 0; i < x.length; i++) 
     x[i]++; 
    } 
    public static void increase(int y) { 
    y++; 
    } 
} 
+0

研究变量的范围并传递值。 – 2013-05-09 18:11:52

+2

向我们解释你所知道的以及你认为它应该如何工作。 – 2013-05-09 18:11:54

回答

1

一个Java方法接收传递的值的拷贝,在原始的,或引用的副本的情况下,在一个对象类型的情况下。 increase(int[])接受一个数组(这是一个引用类型),并增加该数组中的每个值。该方法接收数组引用的副本,但不会更改它。它只是增加阵列中的每个元素,这与您发送的阵列相同。

increase(int)它有点不同。 y变量是您传入的值的副本。当您增加y时,您只是递增该副本。原始值不会更改。所以外观是你传入的价值实际上没有变化。因此,输出将是2 1

0

增加(x),您传递数组的引用,因此增量实际上增加了实际值。而在第二种情况下,您正在传递数组的特定值并增加它并不会真正影响数组中保存的值。欲了解更多信息,Check out the answer here

4

该代码演示(有效)通过引用(在第一个增加方法)和按值调用(在第二个增加方法)之间的区别。实际上,这两种方法都使用按值调用,但在第一种情况下,该值是对对象(数组)的引用,而第二种情况下是一个int(数组中的单个值)。

代码int[] x = {1, 2, 3, 4, 5}创建一个数组。当你呼叫增加(x)时,你正在调用第一个增加方法。该方法遍历数组的元素并递增每个元素。行x[i]++相当于x[i] = x[i] + 1。结果存储回数组。在此调用结束时,该阵列现在包含{2, 3, 4, 5, 6}。因此x[0]2

在第二呼叫到increase(int y)我们不阵列中传递,但值的y[0](即1)。该方法递增变量y,但该方法以外没有任何效果。在Java中,当你传递一个变量时,它通过值传递,这实际上意味着传递了一个值的副本。对该值进行的任何更改都不会影响原始值。

当您传递数组时,您将传递对数组对象的引用。引用无法更改,但可以更改对象的内容(数组内容)。

我不得不承认这有点令人困惑,但重新阅读我已经写了几次,希望你会得到它!

+0

非常感谢你!我设法理解了第一次增加(x)的呼叫,但第二次增加(int y)的呼叫让我很困惑。我现在明白了,一定会一遍又一遍地重新阅读以完全理解它。再次感谢! – user2045470 2013-05-09 18:21:42