美文网首页java
对java值传递和引用传递的理解

对java值传递和引用传递的理解

作者: n油炸小朋友 | 来源:发表于2018-04-01 13:58 被阅读6次

    首先, 我表示赞同java只有值传递这个说法。为什么我这么认为呢?关于基本类型是值传递大家都没有争议,那么对象呢,对象存在栈中,它的数据存在堆中,这就类似于指针了。例如 

        classStu stu1=new classStu(); 

        stu2=stu1;

    在栈中stu1和stu2是两个位置,但是他们对应堆里面同一块地方,但是

        stu2=new classStu(); 

    stu2就会指向堆中一块新开辟的内存,这说明stu2=stu1这只是把堆的地址传递了,是值传递,和引用相当于起别名不同。

    关于String对象,String对象改变值的时候会开辟新的内存。

        String str="abc";

        str="efg";

    当str="efg"时,堆里面开辟了新的内存,str指向那个新的内存,而不是在"abc"那个位置改变值。

        那要是classStu类里面有一个成员变量是String name 那么只是改变name的值,会在classStu类对象指向一个新开辟的内存吗,答案是不会。因为类对象指向的堆内存关于String name这个字段存的是String name这个对象的栈的地址,这个name对象栈地址存的是String name 值的堆地址。改变name这个字段的值,是在堆开辟了新的内存空间,然后改变name对象这个对象在栈里面存的堆的地址,而classStu类指向的堆则不会影响,因为它只是存了name对象的栈地址。

        就像下面我画的那张图说明的:堆中string name对应的内存存的是栈中name对象的地址。name对象改变值,由李明改成了张三,那么栈里面存的就由423变成了486,但是789这个地方存的还是123。

    示例图

    相关文章

      网友评论

        本文标题:对java值传递和引用传递的理解

        本文链接:https://www.haomeiwen.com/subject/kaiocftx.html