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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 14:57:27