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

我们知道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

posted on   tuzhuo  阅读(139)  评论(0编辑  收藏  举报

(评论功能已被禁用)
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示