《Head First Java》对象引用匹配练习题解析求助
《Head First Java》引用变量匹配练习题疑问解答
问题背景
我是Java新手,多年前大学曾修过Java入门课程,近几个月才开始深入学习,目前参加线上课程并购买了《Head First Java》一书。书中一道“将引用变量与对应对象匹配”的练习题,我能理解hq[4]与id=0、hq[3]与id=2的对应关系,但无法理解hq[1]与id=1的匹配逻辑,希望有人能以通俗方式为我解释。
原题内容
题目要求
将每个引用变量与对应的对象匹配,无需使用所有引用。
代码
class HeapQuiz { int id = 0; public static void main(String[] args) { int x = 0; HeapQuiz[] hq = new HeapQuiz[5]; while(x < 3) { hq[x] = new HeapQuiz(); hq[x].id = x; x = x + 1; } hq[3] = hq[1]; hq[4] = hq[1]; hq[3] = null; hq[4] = hq[0]; hq[0] = hq[3]; hq[3] = hq[2]; hq[2] = hq[0]; } }
参考答案
引用变量/HeapQuiz对象:
- hq[1] 匹配 id = 1
- hq[3] 匹配 id = 2
- hq[4] 匹配 id = 0
通俗解释hq[1]与id=1的匹配逻辑
我们可以把引用变量(比如hq[0]、hq[1])看作是贴在对象上的标签,对象就是带有id编号的盒子。下面一步步拆解代码执行过程:
初始对象创建阶段
- 首先创建了一个能装5个HeapQuiz对象的数组hq,此时数组里每个位置都是空的(没有标签)。
- 进入while循环(x从0到2,因为x<3):
- x=0:给hq[0]贴上一个新盒子的标签,盒子id设为0 → hq[0]指向id=0的对象。
- x=1:给hq[1]贴上一个新盒子的标签,盒子id设为1 → hq[1]指向id=1的对象。
- x=2:给hq[2]贴上一个新盒子的标签,盒子id设为2 → hq[2]指向id=2的对象。
这一步结束后,hq[0]、hq[1]、hq[2]分别对应三个不同的对象,id依次是0、1、2;hq[3]、hq[4]还是空的。
后续赋值操作(重点看hq[1]的变化)
我们逐行看后面的代码,观察有没有修改hq[1]的指向:hq[3] = hq[1];:给id=1的盒子再贴一个hq[3]的标签,hq[1]的标签仍在原来的盒子上,没变化。hq[4] = hq[1];:给id=1的盒子再贴一个hq[4]的标签,hq[1]依旧指向id=1的对象。hq[3] = null;:把hq[3]的标签从id=1的盒子上撕下来,变成空的,和hq[1]无关。hq[4] = hq[0];:把hq[4]的标签改贴到id=0的盒子上,还是不影响hq[1]。hq[0] = hq[3];:hq[0]变成空标签,hq[1]的指向没变化。hq[3] = hq[2];:给hq[3]贴上id=2盒子的标签,和hq[1]无关。hq[2] = hq[0];:hq[2]变成空标签,hq[1]自始至终都没被重新赋值过!
总结:整个代码执行过程中,没有任何一行代码修改过hq[1]的指向,它从一开始创建并指向id=1的对象后,就一直指着这个对象,所以最后hq[1]匹配的就是id=1的对象。
内容的提问来源于stack exchange,提问作者John Hansen
相关产品推荐
相关产品推荐

