Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1670397
  • 博文数量: 695
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 4027
  • 用 户 组: 普通用户
  • 注册时间: 2013-11-20 21:22
文章分类

全部博文(695)

文章存档

2018年(18)

2017年(74)

2016年(170)

2015年(102)

2014年(276)

2013年(55)

分类: Java

2017-02-08 13:49:10

先下定论:java中所有的参数传递都是值传递。
通过以下问题来慢慢理解
为什么值传递也可以改变传入参数的值?
知道java基本知识的同学都知道这样一句话“java中除了基本类型是值传递外,其它类型对象都是引用传递”;其实其它类型对象传递的也是值,只是这个值是存储对象的地址而已,所以当然可以通过这个值改变原对象的值。通过下面的C++代码可能更好理解:

点击(此处)折叠或打开

  1. #include <iostream>
  2. using namespace std;

  3. void swap1(int *p,int *q){
  4.     int *t =p;
  5.     p = q;
  6.     q=t;
  7. }
  8. void swap2(int &p,int &q){
  9.     int t = p;
  10.     p=q;
  11.     q=t;
  12. }
  13. void swap3(int *p,int *q){
  14.     int t = *p;
  15.     *p = *q;
  16.     *q= t;
  17. }

  18. int main() {
  19.     int a=3;
  20.     int b=4;
  21.     cout<<"before swap a:"<<a<<"b:"<<b<<endl;
  22.     cout<<"a ptr:"<<&a<<endl;
  23.     //swap1(&a,&b);
  24.     //swap2(a,b);
  25.     swap3(&a,&b);
  26.     cout<<"after swap a:"<<a<<"b:"<<b<<endl;
  27.     return 0;
  28. }
显而易见只有swap2和swap3改变原对象的值。swap1虽然也是传递的地址,但是它是改变的地址值,而不是地址对应对象的值。所有不能实现效果,swap3是在此基础上对地址对应的对象的修改,所有可以实现效果。
再来看下下面的java代码:

点击(此处)折叠或打开

  1. public class SwapTest {
  2.     
  3.     public static void main(String []args){
  4.         Data d1 = new Data(3);
  5.         Data d2 = new Data(4);
  6.         System.out.println("before swap d1:"+d1+"d2:"+d2);
  7.         Swap.swap1(d1,d2);
  8.         Swap.swap2(d1, d2);
  9.         System.out.println("after swap d1:"+d1+"d2:"+d2);
  10.     }

  11. }

  12. class Swap{
  13.     public static void swap1(Data left,Data right){
  14.         int t= right.a;
  15.         right.a = left.a;
  16.         left.a = t;
  17.     }
  18.     public static void swap2(Data left,Data right){
  19.         left = new Data(4);
  20.         right = new Data(3);
  21.     }
  22.     
  23. }

  24. class Data{
  25.     public int a;
  26.     public Data(int a){
  27.         this.a = a ;
  28.     }
  29.     
  30.     @Override
  31.     public String toString() {
  32.         // TODO Auto-generated method stub
  33.         return ""+a;
  34.     }
  35.     
  36. }
这里体会下swap1可以实现效果,swap2不能实现效果。这里可以参考: http://www.cnblogs.com/foreach-break/p/call-by-reference-OR-call-by-value.html
帮助对这里的理解。
http://m.blog.csdn.net/article/details?id=49047217  这篇文章写的也不错




阅读(814) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~