Java 为什么我没有得到NullPointerException
为什么,当我向我的ArrayList中添加一个对象时,它应该向该对象传递一个引用,然后我使该对象等于null,它的输出非常好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<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我认为:方法的参数只是传递的引用的本地副本(它复制原始引用的值-原始对象,或者其他更喜欢说的对象内存地址)。所以,如果以后原始引用将更改,则副本将保持不变并包含原始值。