java引用传递106_(转载)java的值传递与引用传递
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的值传递与引用传递相关推荐
- java string()函数_转载java String.split()函数的用法详解
转载java String.split()函数的用法详解 如果您发现本文排版有问题,可以先点击下面的链接切换至老版进行查看!!!在java.lang包中有String.split()方法的原型是: p ...
- java求约数_[转载]Java求最大公约数与最小公倍数
(看到一份不错的总结,拿来收着) 如果数a能被数b整除,a就叫做b的倍数,b就叫做作a的约数.约数和倍数都表示一个数与另一个数的关系,不能单独存在.如只能说16是某数的倍数,2是某数的约数,而不能孤立 ...
- java生成水印_[转载]java操作word生成水印
应用场景 为了保护版权或辨别文件的真伪,有时需要在生成的Word文件中动态添加水印,PageOffice组件的WaterMark类就封装了给在线编辑的Word文件添加水印这一功能,调用接口非常简单. ...
- java形状类_[转载]JAVA 设计一个形状类Shape 求周长和面积
设计一个形状类Shape,方法:求周长和求面积 形状类的子类:Rect(矩形),Circle(圆形) Rect类的子类:Square(正方形) 不同的子类会有不同的计算周长和面积的方法 创建三个不同的 ...
- 超详细的java基础知识学习(java SE、javaEE)笔记 核心重点!
标识符 Java 的标识符是由字母.数字.下划线_.以及美元符$组成,但是首字母不可以是数字.Java 标识符大小写敏感,长度无限制,不能是 Java 中的关键字.命名规则:要见名知意! u 变量要 ...
- [转载] java中对象作为参数传递给一个方法,到底是值传递,还是引用传递
参考链接: 用Java传递和返回对象 看完绝对清晰~ java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? pdd:所谓java只有按值传递:基本类型 值传递:引用类型,地址值传递,所 ...
- Java中的参数传递,到底是值传递还是引用传递?
文章内容为转载,转载自公众号Hollis关于我要彻底给你讲清楚,Java就是值传递,不接受争辩的那种! 原文链接:我要彻底给你讲清楚,Java就是值传递,不接受争辩的那种! 知乎回答链接:Java 到 ...
- java integer 值传递_在java中String,对象,Integer(包装类型的)关于引用传递仍是值传递...
场景: 你们都知道基本的数据类型,int,float等等这种是按值传递的.可是对于String,对象,Integer是怎样传递呢?java 原理知识: 若是参数类型是原始类型,那么传过来的就是这个参数 ...
- java值传递和引用传递_辨析Java方法参数中的值传递和引用传递
小方法大门道 小瓜瓜作为一个Java初学者,今天跟我说她想通过一个Java方法,将外部变量通过参数传递到方法中去,进行逻辑处理,方法执行完毕之后,再对修改过的变量进行判断处理,代码如下所示. publ ...
最新文章
- VMware VSphere 虚拟化云计算学习配置笔记(一)
- 参加中国十大IT杰出博客
- python中fib什么意思_Python斐波那契数列是什么?怎么用?
- IT职场中外企面试最爱提的问题TOP10
- python的工作方向-python职业发展方向有哪些,各有什么优劣?
- 谷歌技术主管:当我们选择工作时,什么最重要?
- 深度案例 | 纷享销客:用户需求精准洞察下的敏捷开发
- Java 中的四种引用及垃圾回收策略
- ssm整合之六 时间日期装换
- 【项目管理】知识域在过程组中的体现
- Linux网络协议栈(三)——网络设备(1)
- CTF中遇到不知道文件类型_遇到孩子厌学不知道怎么沟通?做好这些策略,孩子肯定爱学...
- 2017-2018-1 20155204 《信息安全系统设计基础》第七周学习总结
- 超实用!Google AutoML 图像分类模型全在这!
- Linux 内核101:[译]地址空间发展简史
- Linux命令发送Http请求
- 基于Python的优化函数可视化
- 微信通话服务器有录音保存吗,微信语音通话如何录音保存并回放
- linux把程序放入后台执行,linux将程序放到后台执行
- 测试hadoop服务器NodeManager无法连接ResourceManager问题
热门文章
- ios开发之plist 的文件的读写以及沙盒容器路径打印
- mysql 数据日志分析_基于mysql数据库的日志分析系统
- 安全方向比路由交换难吗_「网工进阶」路由交换:链路聚合的配置,你都会吗...
- python解复杂方程组_sympy计算方程组的复杂表达式怎么获得数值解?
- 西山居php面试,西山居面试经验
- ajax读取评论数据,评论提交使用ajax提交实现
- osg专业名词:LOD、数据分页、动态调度
- android 卡片旋转动画,Android 卡片翻转效果
- SpringBoot是如何解析参数的
- IntelliJ如何设置自动导包