Java中私有数组成员未用Setter却可直接修改的原因
为什么私有数组成员未通过Setter就能被修改?
问题复现代码
Student类:
public class Student { private String name; private int[] marks; public Student(String name, int[] marks ) { this.name = name; this.marks=marks; } public int[] getMarks() { return marks; } }
Main类:
public class Main { public static void main(String[] args) { int[] marks= {90,85,80,95,100} ; Student Stu1 = new Student("Alex",marks); System.out.println(Stu1.getMarks()[0]);//90 marks[0] =70; System.out.println(Stu1.getMarks()[0]);//70 } }
原因分析
这是Java引用类型的特性导致的:
- 数组属于引用类型,当你把main方法中的
marks数组传给Student构造函数时,this.marks = marks;只是把数组的内存引用地址赋值给了类的私有成员,并没有复制数组的实际内容。也就是说,main里的marks变量和Student对象内的private int[] marks指向的是同一个数组对象。 - 你的
getMarks()方法直接返回了私有数组的引用,外部拿到这个引用后,或者通过原数组变量,都能直接操作同一个数组的元素。private修饰符只限制了对marks这个引用变量本身的访问(比如不能直接给Stu1.marks赋值新数组),但无法限制通过引用对数组内部元素的修改。
修复方案
要避免外部直接修改类内部的私有数组,需要在构造和获取时传递数组的副本而非原引用:
修改后的Student类:
import java.util.Arrays; public class Student { private String name; private int[] marks; public Student(String name, int[] marks ) { this.name = name; // 复制传入数组的内容,而非直接赋值引用 this.marks = Arrays.copyOf(marks, marks.length); } public int[] getMarks() { // 返回数组副本,外部修改副本不会影响内部原数组 return Arrays.copyOf(marks, marks.length); } }
这样再执行Main类的代码,修改main里的marks[0]就不会影响Stu1内部的数组了。
内容的提问来源于stack exchange,提问作者Sug
相关产品推荐
相关产品推荐

