Java与面向对象之随感(2)

时间:2023-03-09 07:09:32
Java与面向对象之随感(2)

我们知道Java语言的一大特性就是相比于c语言和c++语言,其更加安全。那么Java安全性的一个重要保证就是它取消了指针,并且坚决反对数组的出界(c++对当数组超出上限但是还进行读写操作时允许的!),这必然很容易造成缓冲区的溢出,也是因为此,c/c++程序很容易遭到针对此类问题而产生的各种攻击。

Java与面向对象之随感(2)

那么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