java吧 关注:1,238,480贴子:12,708,667
  • 8回复贴,共1

求关于值传递的简单解释

只看楼主收藏回复

public class JavaApplication1 {
public static void main(String[] args) {
int[] arr1 = {1, 2, 3};
int[] arr2 = {1, 2, 3};
test1(arr1);
for (int i=0; i<arr1.length; i++)
System.out.println(arr1[i]);
test2(arr2);
for (int i=0; i<arr2.length; i++)
System.out.println(arr2[i]);
}
public static void test1(int[] arr1) {
int[] newArr = {4, 5, 6};
arr1 = newArr;
for (int i=0; i<arr1.length; i++)
System.out.println(arr1[i]);}
public static void test2(int[] arr2){
for (int i =0; i<arr2.length; i++)
arr2[i] = i+4;
}
}
输出:
4
5
6
1
2
3
4
5
6
如上,在test1中,
arr1变成了{4, 5, 6},但在方法外Print仍然是原本的{1, 2, 3},
为什么在test2执行后,arr2在方法外也指向{4, 5, 6}了呢?


1楼2018-05-02 00:42回复
    这个只是把变量的值传递给方法里面的形参也就是说方法里面的arr和方法外面的arr是不同变量低,所以第一个方法没影响,但是第二个方法他们指向数组的地址是一样的,所以对其中一个的数组进行操作会影响另外一个


    IP属地:广东来自Android客户端3楼2018-05-02 01:11
    收起回复
      兄弟我今天也遇到了这样的问题


      IP属地:浙江来自Android客户端4楼2018-05-02 02:50
      回复
        arr1是全局变量
        newArr是局部变量


        来自Android客户端5楼2018-05-02 07:44
        回复
          test1和test2的参数都是数组,所以本质上传入的分别是数组arr1和arr2引用的地址的值的复制值,所以对于test1: 由于传入的地址是复制的地址,所以把它直接赋值arr1 = newArr相当于把复制地址改为新数组的地址,对原数组其实没有任何影响。因此在方法内可以看到复制的地址改变了,但是在方法外原地址没有任何改变。对于test2:由于复制的地址值和原地址值相同,所以修改其中的元素其实就是修改原数组的元素,因此在方法外依然受到影响。


          7楼2018-05-02 08:32
          回复


            IP属地:浙江8楼2018-05-02 09:12
            回复
              改变了不是很正常吗,把数组对象打印出来看看地址有没变吧


              IP属地:广东来自Android客户端9楼2018-05-02 11:05
              回复