List 传参 引用 赋值null

阅读更多
public class TestThread {
public void test(){
List list = new ArrayList();
TestThread tt = new TestThread();
tt.test2(list);
System.out.println("test2调用后"+list.size());
   
tt.test3(list);
    System.out.println("test3调用后"+list.size());
}
   
public void test2(List list){
    //list =null;
    list=new ArrayList();
    list.add("test2的值1");
    list.add("test2的值2");
}
         public void test3(List list){
    if(list!=null){
    list.add("你好,我还是来了");
    }
}
}
这是个关于栈内存和堆内存的问题
List list = new ArrayList();
这句执行完以后实际在栈内存中产生一个list变量,在堆内存中产生一个ArrayList的对象,list变量的值实际上是堆内存Arraylist的地址,Java中虽然没有指针的概念,这个叫引用,为了便于理解也可以想象成list指向ArrayList

在程序执行了test2(list);之后,实际上在栈内存中又产生了一个新的变量,该变量是传入参数list的复制,这时候你可以理解成在栈内存中存在两个变量,一个是main方法中定义的list变量,一个是test2方法中定义的list变量的复制,两个变量都指向堆内存中存在的ArrayList对象, 然后在tese2()方法中你执行 list=null;实际上只是改变了在test2中生成的list变量复制的值,list变量的值实际上并没有发生改变,这样解释不知道对你有没有帮助

你可能感兴趣的:(List,ArrayList,null,size,引用)