0

好的,所以我知道Java是按值传递的(包括对于引用,它通过引用的值传递对象-即地址)。

如果是这样,那么为什么该swap(int[] array)方法 - 传递一个基元数组 - 有效?

public class TestArraySwap {

    public static void swap(int a, int b) {
        int temp =b;
        b=a;
        a=temp;
    }

    public static void swap(int[]a) {
        int temp = a[1];
        a[1]=a[0];
        a[0]=temp;
    }

    public static void main(String[] args) {
        //Test Primitive swap
        int a=1;
        int b=2;
        System.out.println("a="+a +" b="+b);
        swap(a,b);
        System.out.println("a="+a +" b="+b);

        //Test array swap
        int[] array = new int[2];
        array[0]=1;
        array[1]=2;
        System.out.println("a[0]="+array[0] +" a[1]="+array[1]);
        swap(array);
        System.out.println("a[0]="+array[0] +" a[1]="+array[1]);
    }
}

输出是

a=1 b=2
a=1 b=2
a[0]=1 a[1]=2
a[0]=2 a[1]=1

第二次交换有效 - 我希望它不会,但也许我错过了什么?

4

5 回答 5

3

main 方法引用了一个数组:

R1 ------> [1, 2]

然后它调用该swap()方法。因此,该方法创建并使用了对同一数组的引用的副本swap()

 R1 -----> [1, 2]
             ^
             |
 R2 ---------|

然后该swap()方法更改数组的内容:

 R1 -----> [2, 1]
             ^
             |
 R2 ---------|

它回来了。R1 仍然引用相同的数组,其内容已更改。

于 2013-11-12T20:17:16.677 回答
0

交换有效,因为您将数组的地址(引用)传递给方法。然后该方法对该数组进行操作——与其他方法引用的相同。

我真的不喜欢“Java 是按值传递”这样的说法。我认为这真的很混乱。


 public void methodA(){
     int[] values = {1,2}; 
    // MethodA stack frame has a register that contains a 
    //   memory address (let's say it's 0x1F) that points to a contiguous section of 
    //   memory sized for an integerarray of size 2. 
     methodB(values); // Pass the **memory address** (aka REFERENCE) not the register address
     System.out.println(values[0]); // Prints "100"
 } 

 public void methodB(int[] ints){
     // MethodB stack frame now has a register with the memory address (0x1F)
     //    of 'ints' which is the same address that MethodA stack frame has.
     //    The same REFERENCE
     ints[0] = 100; // Alter the value in mem of 0x1F+0
     ints = new int[2]; // The local register overwrites the memory address of 
                        // the REFERENCE value that was there with 
                        // a new memory address -- say 0x5A
                        // since it's not storing it in the same register 
                        // as MethodA, MethodA will not reflect this.


 }
于 2013-11-12T20:14:34.273 回答
0

经过更多搜索后,我发现这个答案 数组似乎在 Java 中通过引用传递,这怎么可能?

当然还有 Java 规范本身

在 Java 编程语言中,数组是对象

于 2013-11-12T20:14:45.813 回答
0

Java中的引用是指向堆中对象的东西。Java中的数组总是在堆中分配的。所以Java中的数组就像普通的对象

Java中对对象的引用像原始变量(intlong)一样存储在堆栈中,它是存储在变量中的内存地址。所以当他们说对象是传值时,字面意思就是你把地址值复制到方法参数中。

对我来说,这总是令人困惑,因为虽然我确实了解这个过程,但我不记得它是如何正确命名为的

  • Java中没有引用
  • 当我听到应用于对象的“价值”一词时,我总是被卡住
于 2013-11-12T20:22:49.593 回答
0

Java 中的所有内容都是按值(通过副本)传递的。

swap(int[] a)有效,因为它仅传递(复制)数组开头的地址。稍后它直接修改该地址( a[0]) 和下一个地址 ( ) 下的内存a[1]

swap(int a, int b)不起作用,因为它修改了整数的副本。

于 2013-11-12T20:17:15.013 回答