我们知道Java语言的一大特性就是相比于c语言和c++语言,其更加安全。那么Java安全性的一个重要保证就是它取消了指针,并且坚决反对数组的出界(c++对当数组超出上限但是还进行读写操作时允许的!),这必然很容易造成缓冲区的溢出,也是因为此,c/c++程序很容易遭到针对此类问题而产生的各种攻击。
那么Java取缔了指针,则其必然大大缺失了灵活性,比如经典的swap函数(交换两个变量的值)在Java中就没法再用指针实现了,但是也因此换来了稳定性。
下面考虑这样一个Java程序:
package test;
public class test {
private static int a;
public static void main(String [] args) {
modify(a);
System.out.println(a);
}
public static void modify(int a) {
a++;
}
}
很明显输出为0,因为形参a只在方法栈中自增,即不是真正的自增。
再:
package test;
class IntClass {
int value;
}
public class test
{
public static void modifyValue(IntClass s,int val){
s.value = val;
}
public static void main(String args[]){
IntClass a = new IntClass();
modifyValue(a,8);
System.out.println(a.value);
}
}
输出为8;为什么呢?因为语句“modifyValue(a,8);”将a所指向的对象传给了函数形参,我们知道,a的本质是一个地址,地址在计算机的存储中就是一个数据,那么相当于这句话完成了一个值传递的过程,即将声明a所指向的对象的地址和一个常数传给了方法,以此完成了对对象成员属性的更改。我在Java与面向对象之随感(1)中说过,Java要想产生可以操作的对象,就必须使用“A a=new A();”这样一类语句在堆中产生对象,这似乎说明Java通过此产生了可以替代指针功能的机制。现在我们可以自信满满的说:Java语言当中的参数传递全部都是值传递!,只不过基本数据类型传递的是数值,而引用传递的是地址(实质上就是一个数值)罢了。
TZ
2017/2/25夜
于HZAU