码迷,mamicode.com
首页 > 编程语言 > 详细

java值传递和引用传递

时间:2018-03-01 10:16:55      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:传值   alt   comment   实例   term   结果   http   eval   string   

 

优秀博客转发自: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所指向的内存单元没有关系了。所以说,这是值传递,而不是引用传递。

java值传递和引用传递

标签:传值   alt   comment   实例   term   结果   http   eval   string   

原文地址:https://www.cnblogs.com/shuaishuai1993/p/8486981.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!