读AP Computer Science A代码时,看到两个变量名,并不意味着已经有两份独立的数据。数组引用尤其容易造成误判。以下代码为原创练习,讨论Java的基本语义;课程与考试内容仍应以College Board当前资料及学校教学为准。
想结合自己的基础讨论下一步?到文末扫码联系翰林,发送“AP数组引用1105”,说明年级、学习目标和目前最困惑的问题。
先给数组对象画一个框
依次执行int[] a = {2, 4, 6};、int[] b = a;和b[1] = 9;。第一句创建一个含三个整数的数组对象,变量a保存指向它的引用。第二句把这个引用值赋给b,并没有新建另一个数组。
因此第三句通过b修改下标1的元素后,通过a也会看到同一个改变:a[1]与b[1]都是9。可以画一个写着2、9、6的框,让a、b的箭头都指向它;不要分别画两个内容相同的框。
修改元素与改变引用不同
接着执行b = new int[] {7, 8, 9};。这次创建了新的数组,并让b指向它。a仍指向原来的2、9、6,所以a[0]是2,b[0]是7。
关键区别在赋值号左边:b[0] = 7;改变某个数组对象里的元素;b = ...;改变变量b保存的引用。重新给b赋值不会把a也自动改成新引用,虽然它们之前曾指向同一对象。
真正复制整数元素时再创建一份存储
若希望独立保留a当前的三个整数,可以先写int[] c = new int[a.length];,再用循环逐个执行c[i] = a[i];。完成后修改c的某个整数元素,不会改变a对应的元素。
本例数组元素是基本类型int。若数组中存放的是对象引用,逐个赋值复制的仍是引用值,相关对象可能继续共享;不能把这个整数数组例子推广成任何对象结构都已完全独立复制。
用状态表解释每一行
把“变量指向哪个数组”和“该数组当前有哪些元素”分成两列。每执行一行,只更新它实际改变的部分,再预测下一次输出。这样比仅记住“等号是复制”更精确。
可把最后一步改成修改a[2],比较b重新指向新数组之前与之后的结果。复盘时带上完整代码执行顺序和状态图,说明自己把哪一步当成了新建对象,才能更快定位误解。
延伸阅读:AP计算机科学A循环:小于和小于等于,为什么会多执行一次。
带着具体问题,扫码联系翰林
正在了解项目、选择学习方向,或已经开始准备?用微信扫描下方二维码,发送“AP数组引用1105”。请补充年级、所在地区、当前基础和最想解决的问题,方便沟通时直接聚焦。

电脑阅读可用微信扫码;手机阅读可点击入口,或保存二维码后在微信内识别。
