• java值传递和引用传递


    优秀博客转发自:http://blog.csdn.net/zgz0627/article/details/50180971

    java中只有值传递,不存在引用传递。无论是传值还是传地址都属于值传递。注意传地址并不是引用传递。

    一、传值

    1.代码示例:

    1. public class ValuePropagation  
    2. {  
    3.     static void changeValue(int value)  
    4.     {  
    5.         value += 10;  
    6.     }  
    7.   
    8.     public static void main(String[] args)  
    9.     {  
    10.         int num = 10;  
    11.         //未执行changeValue方法前num的值  
    12.         System.out.println(num);  
    13.         changeValue(num);  
    14.         //执行changeValue方法后num的值  
    15.         System.out.println(num);  
    16.     }  
    17. }  

    2.结果:两次输出的结果是一样的,都是10并没有改变。

    3.图解:

    4.分析:num作为参数传递给changeValue(int value)方法时,是将内存空间中num所指向的那个内存单元中的值传递给changeValue(int value)中的参数value变量,而value这个变量也在内存空间中被分配的一个内存单元,changeValue(int value)中所有的操作都是对value所指向的那个内存单元的值进行操作,与num所指的那个内存单元不再有任何关系,所以两次输出的num值是一样的。

    二、传地址

    实例对象作为参数传递时,传递的是对象引用的副本,传的是地址值,现在该对象有两个引用都指向她,对象的内容可以在调用过程中被改变,但是对象的引用始终没有改变,对象引用为传递参数,引用没有改变,很明显这是值传递。

    1.代码示例:

    1. class Person  
    2. {  
    3.     public static String name = "Tom";  
    4. }  
    5.   
    6. public class TransmitAdress  
    7. {  
    8.     static void changeName(Person p)   
    9.     {  
    10.         p.name = "Jerry";  
    11.     }  
    12.   
    13.     public static void main(String[] args)  
    14.     {  
    15.         Person person = new Person();  
    16.   
    17.         //未执行changeName(Person p)前  
    18.         System.out.println(person.name);  
    19.   
    20.         changeName(person);  
    21.   
    22.         //执行changeName(Person p)后  
    23.         System.out.println(person.name);  
    24.     }  
    25. }  

    2.结果:第一次输出的是Tom,第二次输出的Jerry。面对这样的结果,很多人很容易认为这是引用传递,通过下面的图解和分析你就会明白这也是值传递。

    3.图解:

    4.分析:主函数new了一个person对象,实际上分配了两个内存空间:一个在堆内存中,用来存放创建Person类的对象实体,一个在栈内存中,用来存放指向对象的引用变量person。0x345~0x348这段堆内存存放的是对象的实体,0x345是实体对象的首地址,而person所指向的栈内存中存放的值正是0x345,是实体对象的首地址,也就是说,person指向实体对象。当person作为参数传递给changeName(Person p)方法时,是将栈内存中person所指向的内存单元中存放的值复制给了参数p,也就是实体对象的地址传给了p,而参数p在栈内存中已经被分配了一个内存单元,changeName(Person p)中所有的操作都是对p所指的内存单元进行操作,与person所指向的内存单元没有关系了。所以说,这是值传递,而不是引用传递。

  • 相关阅读:
    Python容器(zz)
    [Violet]蒲公英 分块
    [JSOI2008]火星人 hash+splay
    [USACO08DEC]拍头Patting Heads 水题
    [国家集训队]整数的lqp拆分 数学推导 打表找规律
    [HNOI2008]水平可见直线 单调栈
    [LNOI2014]LCA 树链剖分 离线 前缀和 思维题
    [SCOI2008]着色方案 递推 记忆化搜索
    [NOI2010]海拔 平面图转对偶图 最小割
    [NOI2008]志愿者招募 网络流 建模
  • 原文地址:https://www.cnblogs.com/shuaishuai1993/p/8486981.html
Copyright © 2020-2023  润新知