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

首先, 我表示赞同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。


示例图
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,765评论 18 399
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,366评论 11 349
  • 天是白的,树是绿的,雨后的铁轨是重金属灰的,车是蓝的,墙是土黄的,核桃是油工的,歌是致自己的,自己是遍体鳞伤的,...
    YouOldman阅读 177评论 0 0
  • 歌曲开头,吉他的声音让人感到一种很暖心很轻松的感觉,老狼的声音的进入,唱入了心中
    AliceTING阅读 248评论 0 0
  • 1.anaconda安装 (1)在官网下载对应的安装包 (2)在下载目录下执行以下操作 bash Anaconda...
    程序员白总阅读 703评论 0 1