在之前写过的文章《编程语言中形形色色的“指针”》,曾经写过关于java引用问题。总结一下,就是java中往函数传参时,如果参数是对象类型(比如说数组,或者最终继承自Object的对象,有别于int,byte,long这些简单类型)是采用引用的方式,在函数内部改变了对象的属性,函数调用完成后,这些改变依然保留。
下面讲一下溢出问题,当然这里的“溢出”不是指C语言的内存溢出,而是指变量的可修改区域超出了原本预想的情况。比如下面这段代码:
public class RefTest {
public static final int DATA_LEN = 10;
private final byte[] data = new byte[DATA_LEN];
public RefTest() {
}
public byte[] getData() {
return data;
}
public static void main(String[] argv) {
RefTest test = new RefTest();
byte[] data = test.getData();
System.out.println(data[0]);
data[0] = 10;
byte[] data2 = test.getData();
System.out.println(data2[0]);
}
}
代码片段1
最后一句System.out.println(data2[0]);会打印什么呢?会是0吗?恭喜你,答错了,应该10。不要以为你没有给一个private属性提供类似setter的方法,在外部就不能修改了。上面代码中的getData函数,其实将属性data完全暴漏出来了,外部可以随意修改其内部数据。