public class foo {
private int a[];
private int b;
public foo(){
a = new int[] {1,2};
b= 3;
}
public int[] getA(){
return this.a;
}
public int getB(){
return this.b;
}
我注意到可以通过访问这样的对象来改变A的值:
foo f = new foo();
f.getA()[0] = 5; // f.a[0] changes to 5
但是不可能做类似的事情:
f.getB = 5; // gives error
f.getA() = new int[]{2,3}; //gives error
有人可以解释一下这是如何工作的,以及如何防止用户更改数组单元格的值?
提前致谢。
答案 0 :(得分:7)
在Java中,array是一种引用类型,这意味着数组表达式的值是对实际数组的引用。
因此,getA()
的返回值是对对象内私有数组的引用。这打破了封装:您可以访问对象的内部。
您可以通过返回对内部数组的副本的引用,或者通过提供仅返回单个元素的其他API来避免这种情况,例如方法getA(int index)
。
答案 1 :(得分:1)
f.get(A)
返回对数组的引用。您可以像访问任何数组一样访问该数组,并使用f.get(A)[i]=...
为其元素赋值(尽管将返回的数组存储在变量中会更有意义,这样可以多次访问该数组,而无需必须每次都致电f.get(A)
。
但是,您无法通过f.get(A)
分配任何f.get(A)=..
,因为方法调用不是赋值运算符的有效左侧。如你所知,对f.get(A)
的调用可能会生成foo
类成员未引用的新数组,因此分配f.get(A)= new int[5];
没有任何意义,因为不存储新数组的变量。
同样的解释适用于f.getB() = 5;
。
答案 2 :(得分:0)
不是放弃数组,而是让调用者用它做自己喜欢的事情,你可以使用索引的getter
public int getA(int n){
return this.a[n];
}
public void setA(int n, int x) {
this.a[n] = x;
}
现在,调用者无法访问数组,并且在您不知情的情况下无法更改它。