卿辉 发表于 2021-5-12 21:25:23

关于数组值的改变 为什么调用方法后值不变呢

关于数组值的改变 为什么调用方法后值不变呢
public static void main(String[] args) {
      String[] str={"a","b","c","d"};
      test1(str);
      System.out.println(str);
      System.out.println(Arrays.toString(str));
    }
    publicstaticvoid test1(String[] a){
      String[] b={"1","2"};
      System.out.println(b);
       a=b;
         
    }<img src="https://img-bbs.csdn.net/upload/202103/26/1616735909_875737.png" alt="">


刘定 发表于 2021-5-14 06:35:22

能附带有内存图解释一下吗?传入二维数组就可以改变里面一维数组的值 奇怪!

发表于 2021-5-17 20:21:53

你test1方法里,a=b,直接把a引向b的地址了,在main方法里,str指向的还是原先的地址啊。你在方法里不能通过 “=”直接改啊,这改的是地址不是值
你可以for循环赋值或者System.arraycop方法

老刘同志 发表于 2021-5-20 04:32:21

清搜索 java 方法 值传递/引用传递
这个会讲的比较清楚

简单的来说,方法的形参传递的是该对象地址的副本,所以你改变副本的内容是对方法体外没有任何影响,如果你修改的是地址指向对象的内容,那就能看到.

打个比方来说,我有一张地图,当你需要的时候,我复印了一张给你,然后你篡改了这张地图的内容,其实对本体没有任何影响,但你直接去把地图上对应的房子装修了,那就有影响了.
当然基本类型和引用类型在方法传递上其实本质上是一样的,只是基本类型的值就是本身,不存在指向的对象,引用类型是一个内存地址

中医整脊左海峰 发表于 2021-5-21 23:33:13

public static void main(String[] args) {
String[] str = { "a", "b", "c", "d" };
str = test1(str);
System.out.println(str);
System.out.println(Arrays.toString(str));
}

public static String[] test1(String[] a) {
String[] b = { "1", "2" };
System.out.println(b);
a = b;
return a;
}

沉醉星空下 发表于 2021-5-25 10:49:49

传过来一个对象,你修改对象里的属性,会对原对象造成影响,但你直接 对象=另一个对象,那跟原对象就没关系了。
对于数组,你修改数组里的值可以对原对象造成影响。二维数组可以那是因为你修改的是二维数组里的一维数组,也就是二维数组的值,而不是对二维数组重新

远方的树 发表于 2021-5-28 18:31:46

其实你改变的只是a,这个a是在栈内存中的一个局部变量,而str指向的是堆中的某个变量,str和a的关系就是一点,str把它的地址值给了a,无论怎么改变a中的值,都不会改变str中的值

建設 发表于 2021-6-1 15:28:14

publicstaticvoid test1(String[] a){
      a = "1";
      a = "2";
      a = "3";
      a = "4";
      System.out.println(a);
}
这样a里面的值就可以变了
页: [1]
查看完整版本: 关于数组值的改变 为什么调用方法后值不变呢