zoukankan      html  css  js  c++  java
  • Java函数参数传递

    到底是传值 or  传引用(传地址)

    结论:

    1、基本数据类型作为参数传递时,是值得拷贝,无论你是怎么修改这个拷贝的,原来的值是不是被改变的。

    2、对象作为参数传递时,其实是把对象在堆内存的中的地址拷贝了一份传给了参数。

    一、基本类型作为参数传递

    测试1:

    结果:

    所以可以看出,基本类型作为参数传递时,是传递值得拷贝,无论你是怎么修改这个拷贝,原值是不会改变的。

    二、对象作为参数传传递

    测试2:

    结果:

    可以看到值被修改了,那么是不是意味着传递的不是值得拷贝,而是值得本身?

    其实不然的,我们可以再测试第三个例子

    测试3:

    结果:

    可以看出居然sb的值不变,这就可以推断出,我们传递的对象其实并不是对象本身,而是一个地址的拷贝,而是类似了C里面的指针,多个指针同样指向了一块内存,就可以对其进行操作了。

    我们以一个图来看看

    StringBuffer sb = new StringBuffer("Hello ");

    执行完后,就会在堆内存中开辟一个存储sb对象的地址,如图:

    sb 是一个引用,里面存放的是一个地址 "@3a"

    然后执行

    changeData(sb);

    就把sb传递给了changeData方法中的StringBuffer strBuf 。由于sb存放的是地址,所以strBuf也将存放相同的地址,如图:

     此时的,sb和strBuf由于存放的内存地址相同,都指向了 "Hello" 

    strBuf.append("World!");

     执行changeData方法中的这一句后,改变了strBuf指向的内存中的值,如下图3所示

    所以在测试2里面会输出

    修改后sb = Hello World!

    但是在测试3里面又做了一步

    strBuf = new StringBuffer("World");

    这一步相当于在内存中另外开辟的一个StrBuf的存储空间,strBuf由原来指向 "Hello",有重新的指向了 “liuzeyu12a”(“Hi”)

    所以当执行完

     strBuf.append("World!");

    通过上面的比较,就会很清楚的发现,由于sb 和strBuf中存放的地址不一样了。所以当strBuf指向

    的内存值发生改变了,但sb 指向的内存值并不会改变,因此测试3输出了

    修改前sb=Hello
    修改后sb=Hello

    --------------------------------

    综上所述,我们就会明白,Java中对象作为参数传递时,是把对象在内存中的地址拷贝了一份传给了参数。

    参考资料:https://www.cnblogs.com/hpyg/p/8005599.html

  • 相关阅读:
    Asp Net Core Fro MongoDB Part1
    Word 离线发布bolg测试
    Word 2016问题导致无法创建其他博客账号
    字符集工具
    人工智能笔摘
    js数组去重
    ##react-native学习笔记(windows android)##第4天,分析下目录结构
    ##react-native学习笔记(windows android)##第3天,解决白屏闪退问题
    ##react-native学习笔记(windows android)##第2天, Hello world !
    ##react-native学习笔记(windows android)##第1天,搭建开发环境
  • 原文地址:https://www.cnblogs.com/liuzeyu12a/p/10341481.html
Copyright © 2011-2022 走看看