鱼C论坛

 找回密码
 立即注册
查看: 3589|回复: 2

[已解决]输出问题求解

[复制链接]
发表于 2017-8-1 11:27:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
package imooc.imooc.collection;

import java.util.LinkedList;

class Students{
        private String[]stu;
       
        public String[] getStu() {
                return stu;
        }
       
       
        public Students(String []stu) {
                this.stu = stu;
        }
}

public class Test {
     public static void main(String[] args) {
             LinkedList<Students> list = new LinkedList<Students>();
             String []s2 = new String[2];
             s2[0] = "1";
             s2[1] = "2";
             list.add(0,new Students(s2));
             s2[0] = "3";
             s2[1] = "4";
             list.add(1,new Students(s2));
             
             Students s = list.get(0);
             System.out.println(s.getStu()[0]);
             System.out.println(s.getStu()[1]);
             
             Students s1 = list.get(1);
             System.out.println(s1.getStu()[0]);
             System.out.println(s1.getStu()[1]);
     }
}

为什么输出的是 3 4 3 4 , 而不是 1 2  3 4, 要怎么改?
要怎么改,求大神!
最佳答案
2017-8-1 17:15:22
ok  我的见解如下

首先我得说一句  可能我的理解是错误的

String []s2 = new String[2]  此处你创建了一个 str数组 长度为2

也就是说 目前申请了  s[0]  s[1] 这两个地址

list.add(0,new Students(s2));  以后把 s[0] 和 s[1]的地址放入 students 然后再放入   list 中

s2[0] = "3";  s2[1] = "4";  注意这行代码  这行代码就是关键了,  你的 3 和4  是存储在 s[0] s[1] 地址
所指向的值,  也就是说   s[0] s[1] 这两个地址所指向的值已经被你修改成了  3  和4  

那么回到上面 你把 s[0] s[1] 的地址值 给 第一个 Students  .注意 是地址,而不是地址指向的值.
所以  当你 s2[0] = "3";  s2[1] = "4"; 的时候  也会 修改  到 第一个students 的 值 .

故此 你 list 里面两个 students的stu属性 都成了  34  ,最终打印效果为  3434  
如果你不信的话,可以下断点 debug 查看  当你 第一次add 到list 以后
执行 s2[0] = "3";  s2[1] = "4";  然后 再回去查看你的 list  里面的第一个 students 里的stu属性已经变成了34

纯属手打,觉得看懂的的话  可以给个赞  哈哈哈XD
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-8-1 17:15:22 | 显示全部楼层    本楼为最佳答案   
ok  我的见解如下

首先我得说一句  可能我的理解是错误的

String []s2 = new String[2]  此处你创建了一个 str数组 长度为2

也就是说 目前申请了  s[0]  s[1] 这两个地址

list.add(0,new Students(s2));  以后把 s[0] 和 s[1]的地址放入 students 然后再放入   list 中

s2[0] = "3";  s2[1] = "4";  注意这行代码  这行代码就是关键了,  你的 3 和4  是存储在 s[0] s[1] 地址
所指向的值,  也就是说   s[0] s[1] 这两个地址所指向的值已经被你修改成了  3  和4  

那么回到上面 你把 s[0] s[1] 的地址值 给 第一个 Students  .注意 是地址,而不是地址指向的值.
所以  当你 s2[0] = "3";  s2[1] = "4"; 的时候  也会 修改  到 第一个students 的 值 .

故此 你 list 里面两个 students的stu属性 都成了  34  ,最终打印效果为  3434  
如果你不信的话,可以下断点 debug 查看  当你 第一次add 到list 以后
执行 s2[0] = "3";  s2[1] = "4";  然后 再回去查看你的 list  里面的第一个 students 里的stu属性已经变成了34

纯属手打,觉得看懂的的话  可以给个赞  哈哈哈XD
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2017-8-1 20:00:35 | 显示全部楼层
凉生我怕怕 发表于 2017-8-1 17:15
ok  我的见解如下

首先我得说一句  可能我的理解是错误的


没错是你讲的这样,因为是引用传递,所有才会导致这样。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-10 20:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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