私有变量的使用:从传值到传引用

      假如我在一个类中定义了一个private 类型的数组, 理论上来讲, 在这个类外部, 我们只能通过它的get()方法来读取它, 只能通过它的set()方法来修改它, 但经过我的测试发现 , 我居然可以利用  对象名.get()[i] = 数字; 这样的表达式来修改它, 这是不是意味着没必要全定义get()和set()方法, 我们只定义一个get方法就可以达到读取和修改两个目的.

       举个简单的例子:  在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()方法将数据传入私有变量所存放的位置才能进行修改.

        以上部分仅为个人理解,可能存在一些偏差,欢迎指正,还望不吝赐教.





猜你喜欢

转载自blog.csdn.net/kakaluoteyy/article/details/75805481