举个简单的例子: 在Marry类中定义了 private int[] gay = new int[100]; 这个私有的数组变量, 然后在后面定义set ()和get()方法. 然后, 我们在这个类外部实例化这个对象, 在Main类中写入: Marry lesbian = new Marry(); 然后就可以可以这样赋值操作: lesbian.getGay()[i] = 5, 亲测有效
public class Marry { private String heiheih = "来啊"; private int[] gay = new int[100]; // 私有数组gay的get()方法 public int[] get(){ return this.gay; } // 私有数组gay的set()方法 public void set(int[] array){this.gay = array;} // 私有字符串型变量heiheih的get()方法 public String getHeiheih(){ return this.heiheih; } }
// 在Marry类的外部实例化对象并测试输出 public class Main { public static void main(String[] args) { Marry lesbian = new Marry(); lesbian.get()[5] = 100; lesbian.get()[6] = 5; System.out.println(Arrays.toString(lesbian.get())); } }输出结果
[0, 0, 0, 0, 0, 100, 5, 0, 0, 0]
这是不是意味着我们完全就可以只用一个get()方法就可完成private成员的访问和赋值操作,而不用多定义set()这个累赘了呢?(这个例子中虽然set()方法传入的参数是一个数组,但赋值时也是挨个元素逐一赋值,和使用get()方法赋值在效率上并没有什么区别)
但如果private后面不是数组而是其他类型的变量如String,int,char等数据类型时就不能这么玩了,用get()方法完全赋不了值的,此时的编译器会报错"The left-hand side of an assignment must be a variable",提示我们左边必须分配变量
// 在main入口中用get()方法修改私有字符串变量会报错 lesbian.getHeiheih() = "g";
原来,我们之所以能用get()方法对数组型私有变量进行访问修改, 是由于get()方法在向外传递数组型变量时, 传递的是数组的引用(即存放数组的地址). 不仅仅是私有数组变量的传递, Java中在对数组操作时, 传递的基本上都是数组的引用. 我们既然知道了数组的存放地址, 当然就可以对其进行任意的修改, 所有对于数组型的私有变量来说, get()方法已经将数组的存储地址告诉了外部, set()方法确实可有可无. 但其他类型的私有变量却不同, 比如int整型数据, get()方法在向外返回这些类型的数据时, 实际上是将int类型的数据复制一份存储在了寄存器中(而数组是将数组的引用地址存储到了寄存器中), 将寄存器中的值传到外面, 我们却并不知道这个变量的变量名和存储地址等信息, 传出的值相当于get()方法计算得出的字面量, 所有这种情况下, 我们就必须要用set()方法将数据传入私有变量所存放的位置才能进行修改.
以上部分仅为个人理解,可能存在一些偏差,欢迎指正,还望不吝赐教.