更改方法内部的引用会发生什么? (7)

时间:2013-09-15 16:35:32

标签: java

更改方法中的引用会发生什么?

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

2 个答案:

答案 0 :(得分:4)

  

对象,引用类型被认为是不可变的。

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

  

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

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

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

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

nums = nums2 ;

......就像将一张纸上写的东西复制到另一张纸上一样。这不会改变地址恰好引用的房子的内容,对吗?

现在nums只是一个局部变量 - 因为它是一个参数。这根本不会改变调用代码中的任何内容,因为参数总是通过Java中的值传递。所以你要在方法结束之前设置一个局部变量值,这就是全部。它没有任何有意义的效果。

如果这些都不能帮助您,您需要提出更具体的问题。


1 请注意,我并不是说引用必须是内存地址 - “地址”这个词在类比中很方便。

答案 1 :(得分:3)

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