Java初学者求助:如何防止对象关联的数组值被外部修改?
解决Java中对象属性随外部数组修改而变化的问题
嗨,这个问题我熟!你遇到的是Java里引用类型的经典坑,我来给你拆解一下~
问题根源
Java里的数组属于引用类型,当你在构造方法里直接把传入的arrayTest赋值给对象的this.arrayTest时,这两个变量其实指向的是内存中的同一个数组对象。所以你在外部修改array数组的元素时,对象内部的arrayTest自然也会跟着改变——因为它们本来就是同一个东西!
解决方案:创建数组副本
要让对象的属性保持初始值,核心思路就是不要直接引用原数组,而是在构造方法里创建原数组的副本,把副本赋值给对象的属性。这样对象内部的数组和外部传入的数组就是两个完全独立的对象,互相不会影响。
这里有两种常用的复制数组的方式,都可以解决你的问题:
修改后的完整代码
import java.util.Arrays; public class Person { public Person(int[] arrayTest) { // 方法1:用Arrays.copyOf快速创建副本(推荐) this.arrayTest = Arrays.copyOf(arrayTest, arrayTest.length); // 方法2:手动循环复制(效果一样,适合理解原理) // this.arrayTest = new int[arrayTest.length]; // for (int i = 0; i < arrayTest.length; i++) { // this.arrayTest[i] = arrayTest[i]; // } } public int[] getArray() { // 额外建议:防御性返回副本 // 防止外部代码通过get方法拿到内部数组的引用后修改它 return Arrays.copyOf(this.arrayTest, this.arrayTest.length); } public boolean canHaveAsArray(int[] arrayTest) { return true; } private int[] arrayTest = new int[2]; public static void main(String[] args) { int[] array = new int[] {5, 10}; Person obj1 = new Person(array); array[0] = 20; System.out.println(Arrays.toString(obj1.getArray())); // 现在会输出[5, 10] } }
关键修改点说明
- 构造方法内复制数组:
Arrays.copyOf(arrayTest, arrayTest.length)会创建一个和原数组长度相同、元素完全一致的新数组,把这个新数组赋值给对象的arrayTest属性,彻底切断和外部数组的关联。 - get方法返回副本(可选但推荐):如果你不希望外部代码通过
getArray()拿到对象内部数组的引用后修改它,也在get方法里返回副本,这是一种防御性编程的好习惯,能让你的对象更健壮。
现在运行代码,你就能得到期望的[5, 10]输出啦!
内容的提问来源于stack exchange,提问作者Ophelia
相关产品推荐
相关产品推荐

