0

当您更改方法内的引用时会发生什么?

public void reverseX(int[] nums) {
    int[] nums2 = new int[nums.length] ;
    for( int i=0 ; i < nums.length ; i++ )
        nums2[i] = nums[nums.length-(i+1)] ;
    nums = nums2 ;
};

这编译得很好。

代码来自这里,并作为不做什么的示例显示。

http://www.cs.nyu.edu/~cconway/teaching/cs1007/notes/arrays.pdf

4

2 回答 2

4

对象、引用类型应该是不可变的。

不是所有的人。一些,但不是全部。例如,String是不可变的,但StringBuilder不是。所有数组都是可变的。

当 nums 设置为 nums2 时会发生什么。

nums变量被赋予一个新值,该值等于 的现有值nums2

这根本不会改变这些变量所引用的对象的状态。它只是改变变量值本身。

想象变量是一张纸。整数数组就像房子,变量的值就像写在纸上的地址。这一行:

nums = nums2 ;

...就像将写在一张纸上的内容复制到另一张纸上一样。这不会改变地址所指的房子的内容,对吧?

Nownums只是一个局部变量——因为它是一个参数。这根本不会改变调用代码中的任何内容,因为在 Java 中参数总是按值传递。因此,您在方法结束之前设置了一个局部变量值,仅此而已。它不会产生任何有意义的影响。

如果这些都没有帮助你,你需要问一个更具体的问题。


1请注意,我并不是说引用一定是内存地址——“地址”这个词只是为了方便类比。

于 2013-09-15T16:37:51.853 回答
3

什么都没发生。引用类型是按值传递的,nums局部变量也是如此。它不会影响方法之外的任何内容。

于 2013-09-15T16:37:34.150 回答