大家能解释一下,这个代码运行的结果和为什么会是这样的结果么?

Leaybc 发布于 2016/12/27 09:38
阅读 113
收藏 0

/** 

     * 测试 
     */ 
    public static void main(String[] args) {  
     new TestClass().test();
    }  
    
    public void test(){
     TestClassc = new TestClass();
     List<Integer> list = new ArrayList<Integer>();
     c.test2(list);
     System.out.println("list:"+list);
    
    }
    
    public void test2(List<Integer> list){
     list.add(1);
     list.add(2);
     List<Integer> list2 = new ArrayList<Integer>();
     list2.add(3);
     list = list2;
     System.out.println("改变指向:"+list);
    }


运行完test2结果之后,我以为内存地址会清空了。但是在test中,还是会打印之前的值,有朋友能详细的解释一下这个结果的原因么。先谢谢了。

加载中
0
Endless2010
Endless2010

test2(List<Integer> list){  这个list是形参,可以理解为一个指向原来list的指针,当你加入1和2时,会修改原来的list,list=list2,这个只是把形参的指针指向别的地方,但是原来的list还在那里,就是说相当于有2个指针,一个是原始list的,一个是形参的,你改变了形参的,原来的还在,但不论对哪个指向的内容修改都会修改list

Leaybc
Leaybc
嘿嘿,是的,看来我还是忽略了这点。以为是同一个引用呢。谢谢解答~
0
f
fgod
List<Integer> list = new ArrayList<Integer>();
创建了一个int集合a ,并且list指向集合地址
c.test2(list),
创建list的副本,副本同样指向int集合
test2()方法中,int集合a 内容可以被引用副本进行赋值
List<Integer> list2 = new ArrayList<Integer>();
新建一个int集合 b,
list=list2,引用副本的地址指向新的集合 b
原list指向一直没做改变,但是指向的集合a的内容被引用副本改变。
Leaybc
Leaybc
看了一下相关的资料,发现的确是的,看来我基础还是薄弱了。谢谢解答~
返回顶部
顶部