类实例变量重分配后,为何已赋值的局部变量引用未同步更新?
为什么修改
firstNode后lastNode仍然是null? 首先咱们先把你的代码补全并标关键逻辑,方便分析:
private Node firstNode = null; public void test() { int item = 0; Node lastNode; // 核心步骤1:把firstNode当前的值(null)复制给lastNode lastNode = firstNode; Node newNode = new Node(item); // 补全你代码里漏写的变量声明 // 核心步骤2:修改firstNode的指向,但和lastNode无关 firstNode = newNode; // 预期lastNode现在指向newNode,但实际因lastNode仍为null触发空指针异常 }
你疑惑的本质是没搞清楚Java里引用类型变量的工作逻辑——咱们可以把引用变量类比成一个装着「对象内存地址」的小盒子:
- 初始时
firstNode这个盒子里装的是null(没有任何对象的地址)。 - 当你执行
lastNode = firstNode;时,是把firstNode盒子里的内容(也就是null)完完整整复制了一份,放到lastNode这个新盒子里。这时候两个盒子是完全独立的,只是暂时装了一样的内容。 - 之后你创建了新的
Node对象,执行firstNode = newNode;——这一步只是把firstNode盒子里的旧内容(null)替换成了新Node的地址,但lastNode盒子里的内容并没有被改动,它还是之前复制过来的null,自然会触发空指针异常。
简单总结:Java里的变量赋值(包括方法参数传递)都是值传递——对于引用类型,传递/复制的是「引用的值」(也就是对象的内存地址),而不是把两个变量绑定成“联动关系”。修改其中一个变量的指向,不会影响另一个变量里存储的旧地址。
如果想让lastNode也指向新的Node,你需要在firstNode更新后,再执行一次lastNode = firstNode;,或者直接把newNode赋值给lastNode。
内容的提问来源于stack exchange,提问作者user3002486
相关产品推荐
相关产品推荐

