1 说明:本文的适用对象为java初学者、如果有读者发现文章中有叙述不妥之处,请指正。2

3 今天在论坛上有人提了一个关于java中调用函数时有没有引用传递的问题,可谓是吵的不可开交。有人说java只有值传递,也有人说java既有值传递也有引用传递,那么java中到底有没有引用传递呢,下面我来分析一下。4

5 一、首先来明确一下"值传递"和"引用传递的"区别6

7 值传递:是对所传递参数进行一次副本拷贝,对参数的修改只是对副本的修改,函数调用结束,副本丢弃,原来的变量不变(即实参不变)8 引用传递:参数被传递到函数时,不复制副本,而是直接将参数自身传入到函数,函数内对参数的任何改变都将反映到原来的变量上。9 二、java中引用的含义10

11 C++和java中都有引用的概念,但在这两种语言中却有完全不同的含义。C++中我们可以用形如"int &b=a”的形式来定义变量a的一个引用b,b只是a的一个别名,b和a在内存中占同一个存储单元,利用引用机制我们可以在调用函数时实现值的双向传递——即引用传递,看下面代码:

12

13 示例一14

15 #include

16

17 using namespace std;18

19 intmain()20

21 {22

23 void swap(int &,int &);24

25 int i=3,j=5;26

27 swap(i,j);28

29 cout<

31 return 0;32

33 }34

35

36

37 void swap(int &a,int &b)38

39 {40

41 inttemp;42

43 temp=a;44

45 a=b;46

47 b=temp;48

49 }50

51 执行上面的程序输出的是i=5 j=3,a和b传递给swap()函数的时候,是传递的他们本身的地址,不是他们的拷贝,所以在函数中对他们的改变可以直接影响到实参a和b,这就是引用传递。52

53 java中的引用更像C++中的指针,当我们定义一个对象时(比如Person p=newPerson()),定义的对象实例会放到java堆中,而变量p(即引用)会放到java栈中,p指向堆中的Person对象实例。54

55 三、对引用传递的认识误区56

57 为什么有很多人认为java有引用传递呢?一种情况是有人认为调用函数时其参数有可能是引用(如上面的p),所以java有引用传递,这部分人对引用传递根本没有正确的认识;而另一种情况看似有道理,但是仔细分析也是不正确的的,他们往往会用如下的代码来证明他们的观点:58

59 实例二:60

61 复制代码62 classDemo{63 inta;64 public Demo(inta){65 this.a=a;66 }67 }68 public classTestQuote{69 public static voidmain(String args[]){70 Demo d1=new Demo(1);71 Demo d2=new Demo(2);72 System.out.println(d1.a);73 System.out.println(d2.a);74 function(d1,d2);75 System.out.println(d1.a);76 System.out.println(d2.a);77 }78 private static voidfunction(Demo d1,Demo d2){79 inta;80 a=d1.a;81 d1.a=d2.a;82 d2.a=a;83 }84 }85 复制代码86 他们的观点如下:执行上面的代码,调用function()函数以前输出的结果是1、2,调用function()函数之后输出的结果会是2、1,可见在函数内对d1和d2的改变反映到了原来的变量上,要不是不会输出2、1的。87

88 这种解释是很迷惑人的,看上去好像很正确,下面的代码会很好的反驳上面的观点:89

90 示例三:91

92 复制代码93 classDemo{94 inta;95 public Demo(inta){96 this.a=a;97 }98 }99 public classTestQuote{100 public static voidmain(String args[]){101 Demo d1=new Demo(1);102 Demo d2=new Demo(2);103 System.out.println(d1.a);104 System.out.println(d2.a);105 function(d1,d2);106 System.out.println(d1.a);107 System.out.println(d2.a);108 }109 private static voidfunction(Demo d1,Demo d2){110 Demo temp;111 temp=d1;112 d1=d2;113 d2=temp;114 }115 }116 复制代码117 执行上面的代码,调用function()前后程序输出的都是1、2,此程序试图通过调用function()交换d1和d2,但是没有成功,为什么呢?因为d1和d2是值传递,function()中的d1和d2是main()函数中d1和d2的副本,调用完function()不会对main()中的变量产生影响。再看示例二中,function()函数内改变的并不是d1和d2本身的值,而是d1和d2指向的对象的值,调用完function()后d1和d2仍然指向函数调用前的堆地址,即函数参数是栈中的d1和d2,而不是堆中d1和d2指向的对象,即使你在函数中改变了堆中的对象,但没有改变函数参数的值。所以示例二并不是什么引用传递;可见java中只有值传递。118

119

120

121 但是网上有很多针对"java值传递和引用传递进行的区别"的文章,如果读者看到的话一定要清楚,其中所说的引用传递是不正确的,他们所说的引用传递就是示例二中的那种情况。不幸的是,网上有很多文章都把示例二中的那样的传递看做引用传递,如果读者看到知道是什么意思就行了。

java引用传递106_(转载)java的值传递与引用传递相关推荐

  1. java string()函数_转载java String.split()函数的用法详解

    转载java String.split()函数的用法详解 如果您发现本文排版有问题,可以先点击下面的链接切换至老版进行查看!!!在java.lang包中有String.split()方法的原型是: p ...

  2. java求约数_[转载]Java求最大公约数与最小公倍数

    (看到一份不错的总结,拿来收着) 如果数a能被数b整除,a就叫做b的倍数,b就叫做作a的约数.约数和倍数都表示一个数与另一个数的关系,不能单独存在.如只能说16是某数的倍数,2是某数的约数,而不能孤立 ...

  3. java生成水印_[转载]java操作word生成水印

    应用场景 为了保护版权或辨别文件的真伪,有时需要在生成的Word文件中动态添加水印,PageOffice组件的WaterMark类就封装了给在线编辑的Word文件添加水印这一功能,调用接口非常简单. ...

  4. java形状类_[转载]JAVA 设计一个形状类Shape 求周长和面积

    设计一个形状类Shape,方法:求周长和求面积 形状类的子类:Rect(矩形),Circle(圆形) Rect类的子类:Square(正方形) 不同的子类会有不同的计算周长和面积的方法 创建三个不同的 ...

  5. 超详细的java基础知识学习(java SE、javaEE)笔记 核心重点!

    标识符 Java 的标识符是由字母.数字.下划线_.以及美元符$组成,但是首字母不可以是数字.Java 标识符大小写敏感,长度无限制,不能是 Java 中的关键字.命名规则:要见名知意! u  变量要 ...

  6. [转载] java中对象作为参数传递给一个方法,到底是值传递,还是引用传递

    参考链接: 用Java传递和返回对象 看完绝对清晰~ java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? pdd:所谓java只有按值传递:基本类型  值传递:引用类型,地址值传递,所 ...

  7. Java中的参数传递,到底是值传递还是引用传递?

    文章内容为转载,转载自公众号Hollis关于我要彻底给你讲清楚,Java就是值传递,不接受争辩的那种! 原文链接:我要彻底给你讲清楚,Java就是值传递,不接受争辩的那种! 知乎回答链接:Java 到 ...

  8. java integer 值传递_在java中String,对象,Integer(包装类型的)关于引用传递仍是值传递...

    场景: 你们都知道基本的数据类型,int,float等等这种是按值传递的.可是对于String,对象,Integer是怎样传递呢?java 原理知识: 若是参数类型是原始类型,那么传过来的就是这个参数 ...

  9. java值传递和引用传递_辨析Java方法参数中的值传递和引用传递

    小方法大门道 小瓜瓜作为一个Java初学者,今天跟我说她想通过一个Java方法,将外部变量通过参数传递到方法中去,进行逻辑处理,方法执行完毕之后,再对修改过的变量进行判断处理,代码如下所示. publ ...

最新文章

  1. VMware VSphere 虚拟化云计算学习配置笔记(一)
  2. 参加中国十大IT杰出博客
  3. python中fib什么意思_Python斐波那契数列是什么?怎么用?
  4. IT职场中外企面试最爱提的问题TOP10
  5. python的工作方向-python职业发展方向有哪些,各有什么优劣?
  6. 谷歌技术主管:当我们选择工作时,什么最重要?
  7. 深度案例 | 纷享销客:用户需求精准洞察下的敏捷开发
  8. Java 中的四种引用及垃圾回收策略
  9. ssm整合之六 时间日期装换
  10. 【项目管理】知识域在过程组中的体现
  11. Linux网络协议栈(三)——网络设备(1)
  12. CTF中遇到不知道文件类型_遇到孩子厌学不知道怎么沟通?做好这些策略,孩子肯定爱学...
  13. 2017-2018-1 20155204 《信息安全系统设计基础》第七周学习总结
  14. 超实用!Google AutoML 图像分类模型全在这!
  15. Linux 内核101:[译]地址空间发展简史
  16. Linux命令发送Http请求
  17. 基于Python的优化函数可视化
  18. 微信通话服务器有录音保存吗,微信语音通话如何录音保存并回放
  19. linux把程序放入后台执行,linux将程序放到后台执行
  20. 测试hadoop服务器NodeManager无法连接ResourceManager问题

热门文章

  1. ios开发之plist 的文件的读写以及沙盒容器路径打印
  2. mysql 数据日志分析_基于mysql数据库的日志分析系统
  3. 安全方向比路由交换难吗_「网工进阶」路由交换:链路聚合的配置,你都会吗...
  4. python解复杂方程组_sympy计算方程组的复杂表达式怎么获得数值解?
  5. 西山居php面试,西山居面试经验
  6. ajax读取评论数据,评论提交使用ajax提交实现
  7. osg专业名词:LOD、数据分页、动态调度
  8. android 卡片旋转动画,Android 卡片翻转效果
  9. SpringBoot是如何解析参数的
  10. IntelliJ如何设置自动导包