我尝试了以下代码,它有一个final
名为 的实例变量data
。这是在构造函数中使用int[]
参数实例化的。如果 int[] 数组的元素发生更改,则更改将反映在实例变量中并显示在show()'s
输出中。但是,如果我将外部数组设置为 null 或新数组,则更改不会反映在 show() 输出中。
为什么会这样?如果外部数组由 ext[0]=x 更改,则更改显示在 inst.variable 中。如果将 ext 引用设置为新对象,则不会发生。
public class MutabilityTest {
public static void main(String[] args) {
int[] ext = new int[] {1,2,3,4,5};
FMutable xmut = new FMutable(ext);
mut.show(); //shows [1,2,3,4,5]
System.out.println("changed ext array");
ext[0] = 99;
System.out.println("ext:"+Arrays.toString(ext)); //[99,2,3,4,5]
mut.show(); //shows [99,2,3,4,5]
System.out.println("set ext array to new");
ext = new int[]{8,8,8,8}
System.out.println("ext:"+Arrays.toString(ext)); //[8,8,8,8]
mut.show();//expected [8,8,8,8] but got [99,2,3,4,5]
ext = null;
System.out.println("ext:"+Arrays.toString(ext)); //null
mut.show(); //shows same [99,2,3,4,5]
}
}
class FMutable{
private final int[] data;
public FMutable(int[] indata){
this.data = indata;
}
public void show(){
System.out.println("XMutable:"+Arrays.toString(this.data));
}
}