You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

《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编号的盒子。下面一步步拆解代码执行过程:

  1. 初始对象创建阶段

    • 首先创建了一个能装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]还是空的。
  2. 后续赋值操作(重点看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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 00:17:19