Java 为什么我没有得到NullPointerException

Java 为什么我没有得到NullPointerException,java,exception,object,null,Java,Exception,Object,Null,为什么,当我向我的ArrayList中添加一个对象时,它应该向该对象传递一个引用,然后我使该对象等于null,它的输出非常好 ArrayList<Test> testList = new ArrayList<>(); Test test = new Test(); System.out.println(test); testList.add(test); for(Test t : testList) {

为什么,当我向我的ArrayList中添加一个对象时,它应该向该对象传递一个引用,然后我使该对象等于null,它的输出非常好

    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);
    }
然而,产量是50,50,50
调用
add
时,
ArrayList
现在对同一对象有自己的引用,而不是50,50,null

test ----> Test() object
             ^
testList ----|
将引用
test
设置为
null
时,这不受影响

test ----> null

testList ----> Test() object

调用
add
时,
ArrayList
现在对同一对象有自己的引用

test ----> Test() object
             ^
testList ----|
将引用
test
设置为
null
时,这不受影响

test ----> null

testList ----> Test() object

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


将对值(也称为对象)的引用添加到列表中,然后删除该引用。然而,该值仍然存在于内存中,并且该列表仍然有一个对该值的引用,尽管您的原始引用已为空

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


将对值(也称为对象)的引用添加到列表中,然后删除该引用。然而,该值仍然存在于内存中,并且该列表仍然有对该值的引用,尽管原始引用为空

当您将对对象的引用传递给
ArrayList
时,您实际上创建了另一个由ArrayList用于引用该对象的引用

当您将
null
赋值给变量
test
时,实际上是“取消”引用。数组列表的引用不会发生任何变化

更简单

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

Test one = new Test()
Test two = one;
此时,两个引用都指向同一个对象

one=null


现在
one
为空,但是
two
仍然引用该对象

将对对象的引用传递给
ArrayList
时,实际上创建了另一个引用,ArrayList使用该引用来引用该对象

当您将
null
赋值给变量
test
时,实际上是“取消”引用。数组列表的引用不会发生任何变化

更简单

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

Test one = new Test()
Test two = one;
此时,两个引用都指向同一个对象

one=null


现在
one
为空,但是
two
仍然引用该对象

请问爪哇是路过的吗@PSHEMO当您执行
testList.add(测试)时
您正在传递
test
(当前存储的实例,而不是
test
引用)的值。如果以后更改
test
(在本例中为
null
)的值,则不会影响先前传递的值。@Pshemo上的更多信息我认为:java只通过引用传递(指向值的指针)。这些值存在于内存中,如果有对该值的引用,则这些值也存在。引用上的方法会影响该值,但将引用指定给另一个值只会将引用指向别处。这是一个合理的解释吗?@Quincunx我认为:方法的参数只是传递的引用的本地副本(它复制原始引用的值-原始对象,或者其他更喜欢说的对象内存地址)。所以以后如果原始引用发生变化,副本将保持不变并包含原始值@PSHEMO当您执行
testList.add(测试)时
您正在传递
test
(当前存储的实例,而不是
test
引用)的值。如果以后更改
test
(在本例中为
null
)的值,则不会影响先前传递的值。@Pshemo上的更多信息我认为:java只通过引用传递(指向值的指针)。这些值存在于内存中,如果有对该值的引用,则这些值也存在。引用上的方法会影响该值,但将引用指定给另一个值只会将引用指向别处。这是一个合理的解释吗?@Quincunx我认为:方法的参数只是传递的引用的本地副本(它复制原始引用的值-原始对象,或者其他更喜欢说的对象内存地址)。所以,如果以后原始引用将更改,则副本将保持不变并包含原始值。