zoukankan      html  css  js  c++  java
  • Java中引用传递还是值传递的问题

    我喜欢的一篇文章在这儿:传送门

    总结:

      1.虽然这篇文章没有提到值传递和引用传递两个概念,但是确解决了它们的根本问题。因为函数调用实际上也是给形参赋值的意思。

      2.因为值传递所研究的目的是,实参不随形参的改变而改变,即实参前后相同。

        引用传递所研究的目的是,实参随形参的改变而改变,即实参前后不同。

      3.要看实参是否改变,需要知道一个知识:Java里面的==号,比较的是两个引用是否指向同一块内存。

      例如:

        
    1         String str1 = new String("1");
    2         String str2 = new String("1");
    3         System.out.println(str1 == str2);
    View Code

        打印false,因为在堆中不能共用相同值的内存,str2必须用new在堆中重新申请内存。即str1和str2分别指向不同的内存,因此为false。

      再例如:

        
    1         String str1 = "1";
    2         String str2 = "1";
    3         System.out.println(str1 == str2);
    View Code

        打印true,因为栈中可以共用内存,str2不用再在栈中申请内存了。即str1和str2指向同一块内存,因此为true。

      4.有了上面3条知识,就可以再考虑参数传递还是值传递了。

        Java进行函数调用。就是将实参的引用赋给形参,也就是将实参所指的内存地址赋给形参。

        ①:实参所指地址在栈中,不管怎么改变形参,都会在栈或堆中创建新的空间,不会改变实参的空间。

        ②:实参所指地址在堆中,则形参修改堆中的数据,会影响到实参所指的空间值。

      5.到底是值传递还是引用传递?值传递,因为引用永远不会改变(慢慢体会)。会变得只有引用所指的内存存储的内容。

    扩展:从堆和栈的特性考虑问题,还可以解决String和new String的问题,解决方法同理。

  • 相关阅读:
    [置顶] Ubuntu 12.04以上如何恢复GNOME传统界面
    Cstyle的UEFI导读之SEC第一篇 Reset Vector
    二叉排序树的实现
    【最长上升子序列】HDU 1087——Super Jumping! Jumping! Jumping!
    java中的代理
    eclipse连接远程hadoop集群开发时0700问题解决方案
    eclipse连接远程hadoop集群开发时权限不足问题解决方案
    垂死或涅槃重生 -- Delphi XE5 我们将宣布感情的回归
    百度地图 Android SDK
    MySQL第五个学习笔记 该数据表的操作
  • 原文地址:https://www.cnblogs.com/yulianggo/p/10446394.html
Copyright © 2011-2022 走看看