2014-02-19 217 views
0

为什么当我向我的ArrayList添加一个对象时,应该将它传递给对象的引用,然后使对象等于空,它输出完全正常。为什么我没有得到NullPointerException

ArrayList<Test> testList = new ArrayList<>(); 

    Test test = new Test(); 
    System.out.println(test); 

    testList.add(test); 

    for(Test t : testList) 
    { 
     System.out.println(t); 
    } 

    test = null; 

    for(Test t : testList) 
    { 
     System.out.println(t); 
    } 

测试构造去为:

int x = 0; 

Test() 
{ 
    x = 50; 
} 

public String toString() 
{ 
    return x + ""; 
} 

然而,输出为50,50,50 而不是50,50,空

+1

Java是通过价值 – Pshemo

+0

请详细说明一下吗? @Pshemo – Otanan

+0

当你做'testList.add(test);'你正在传递'test'的值(当前存储的实例,而不是'test'引用)。如果稍后将'test'的值(在您的情况下更改为'null'),它不会影响先前传递的值。更多信息[is-java-pass-by-reference](http://stackoverflow.com/questions/40480/is-java-pass-by-reference) – Pshemo

回答

3

当你调用add,该ArrayList现在有自己对同一个对象的引用。

test ----> Test() object 
      ^
testList ----| 

由您参考test设置null不受影响。

test ----> null 

testList ----> Test() object 
2

因为Java中引用类型和值类型之间存在差异。

您将值(a.k.a.对象)的引用添加到列表中,然后删除引用。但是,值仍然存在于内存中,尽管您的原始引用已被取消,但该列表仍然具有对该值的引用。

干杯

1

当你提到过反对ArrayList实际上创建所使用ArrayList的引用对象又引用。

当您将null分配给变量test时,您实际上“取消”了您的参考。引用数组列表没有任何反应。

更简单。

如果你有2个变量:一个和两个:

Test one = new Test() 
Test two = one; 

此时两个引用指向同一个对象。

one = null;

现在one为空,但仍two是指该对象。

相关问题