小白教程

 找回密码
 立即注册
查看: 10019|回复: 7

[已解决]关于数组值的改变 为什么调用方法后值不变呢

[复制链接]

1

主题

1

帖子

3

积分

新手上路

Rank: 1

积分
3
发表于 2021-5-12 21:25:23 | 显示全部楼层 |阅读模式
关于数组值的改变 为什么调用方法后值不变呢
  1. public static void main(String[] args) {
  2.         String[] str={"a","b","c","d"};
  3.         test1(str);
  4.         System.out.println(str);
  5.         System.out.println(Arrays.toString(str));
  6.     }
  7.     public  static  void test1(String[] a){
  8.         String[] b={"1","2"};
  9.         System.out.println(b);
  10.        a=b;
  11.          
  12.     }<img src="https://img-bbs.csdn.net/upload/202103/26/1616735909_875737.png" alt="">
复制代码


最佳答案
2021-5-20 04:32:21
清搜索 java 方法 值传递/引用传递
这个会讲的比较清楚

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

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

使用道具 举报

1

主题

3

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2021-5-14 06:35:22 | 显示全部楼层
能附带有内存图解释一下吗?  传入二维数组就可以改变里面一维数组的值 奇怪!
回复

使用道具 举报

0

主题

1

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2021-5-17 20:21:53 | 显示全部楼层
你test1方法里,a=b,直接把a引向b的地址了,在main方法里,str指向的还是原先的地址啊。你在方法里不能通过 “=”直接改啊,这改的是地址不是值
你可以for循环赋值或者System.arraycop方法
回复

使用道具 举报

0

主题

1

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2021-5-20 04:32:21 | 显示全部楼层 &
清搜索 java 方法 值传递/引用传递
这个会讲的比较清楚

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

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

使用道具 举报

0

主题

1

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 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;
}
回复

使用道具 举报

0

主题

1

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2021-5-25 10:49:49 | 显示全部楼层
  1. 传过来一个对象,你修改对象里的属性,会对原对象造成影响,但你直接 对象=另一个对象,那跟原对象就没关系了。
  2. 对于数组,你修改数组里的值可以对原对象造成影响。二维数组可以那是因为你修改的是二维数组里的一维数组,也就是二维数组的值,而不是对二维数组重新
复制代码
回复

使用道具 举报

2

主题

6

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2021-5-28 18:31:46 | 显示全部楼层
其实你改变的只是a,这个a是在栈内存中的一个局部变量,而str指向的是堆中的某个变量,str和a的关系就是一点,str把它的地址值给了a,无论怎么改变a中的值,都不会改变str中的值
回复

使用道具 举报

1

主题

2

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2021-6-1 15:28:14 | 显示全部楼层
  1. public  static  void test1(String[] a){
  2.         a[0] = "1";
  3.         a[1] = "2";
  4.         a[2] = "3";
  5.         a[3] = "4";
  6.         System.out.println(a);
  7. }
复制代码

这样a里面的值就可以变了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|小白教程 ( 粤ICP备20019910号 )

GMT+8, 2024-9-20 12:36 , Processed in 0.046146 second(s), 29 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

快速回复 返回顶部 返回列表