私有变量的使用:从传值到传引用
2017-07-22 20:26
197 查看
假如我在一个类中定义了一个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, 亲测有效
这是不是意味着我们完全就可以只用一个get()方法就可完成private成员的访问和赋值操作,而不用多定义set()这个累赘了呢?(这个例子中虽然set()方法传入的参数是一个数组,但赋值时也是挨个元素逐一赋值,和使用get()方法赋值在效率上并没有什么区别)
但如果private后面不是数组而是其他类型的变量如String,int,char等数据类型时就不能这么玩了,用get()方法完全赋不了值的,此时的编译器会报错"The left-hand side of an assignment must be a variable",提示我们左边必须分配变量
原来,我们之所以能用get()方法对数组型私有变量进行访问修改, 是由于get()方法在向外传递数组型变量时, 传递的是数组的引用(即存放数组的地址). 不仅仅是私有数组变量的传递, Java中在对数组操作时, 传递的基本上都是数组的引用. 我们既然知道了数组的存放地址, 当然就可以对其进行任意的修改, 所有对于数组型的私有变量来说, get()方法已经将数组的存储地址告诉了外部, set()方法确实可有可无. 但其他类型的私有变量却不同,
比如int整型数据, get()方法在向外返回这些类型的数据时, 实际上是将int类型的数据复制一份存储在了寄存器中(而数组是将数组的引用地址存储到了寄存器中), 将寄存器中的值传到外面, 我们却并不知道这个变量的变量名和存储地址等信息, 传出的值相当于get()方法计算得出的字面量, 所有这种情况下, 我们就必须要用set()方法将数据传入私有变量所存放的位置才能进行修改.
以上部分仅为个人理解,可能存在一些偏差,欢迎指正,还望不吝赐教.
举个简单的例子: 在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()方法将数据传入私有变量所存放的位置才能进行修改.
以上部分仅为个人理解,可能存在一些偏差,欢迎指正,还望不吝赐教.
相关文章推荐
- python 进制运算 位运算 property的使用 通过property调用私有变量
- java中使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
- 使用 final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
- 输入两个整数,将它们按由大到小的顺序输出。要求使用变量的引用
- Java中引用变量的使用_传引用就是传地址。因为"传地址数值"比"传对象的拷贝" 简单 。
- vs2010 linq语法使用中如果用到外部定义的变量会报错 没有引用对象
- 使用Java反射机制实现访问类中的私有变量或者方法
- shell中用$来引用变量的值,但对变量赋值的时候无需使用$符号
- 关于拷贝构造函数和赋值操作重载函数访问同类引用参数的私有变量的疑问
- [Effective C++第三版•中文版][第20条]尽量使用“引用常量”传参,而不是传值
- 使用指针在类外修改类的私有变量
- 使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
- 关于引用传值&变量
- 引用变量的类型强转以及InstanceOf方法的使用
- JavaScript: * JavaScript:基本使用: * ECMAScript: * 变量:弱变量类型: var i; * 数据类型:原始类型和引用类型.
- C++ 类成员引用变量的使用
- 使用弱引用指向内部变量时的注意事项.jpg
- 黑马程序员 使用final修饰一个变量时,是引用不能变还是引用对象不能变
- 使用指针在类外修改类的私有变量
- C++ 类成员引用变量的使用