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

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

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

二、java中引用的含义

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

#include <iostream>
using namespace std;int main()
{void swap(int &,int &);int i=3,j=5;swap(i,j);cout<<"i="<<i<<"j="<<j<<endl;return 0;
}void swap(int &a,int &b)
{int temp;temp=a;a=b;b=temp;
}

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

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

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

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

实例二:

/*** java中是否有“值传递”也有“引用传递”** @author: JC.Lin* @data: 2019/2/19 22:13*/
public class TransferParamTest {static class Demo {int a;public Demo(int a) {this.a = a;}}private static void function1(Demo d1, Demo d2) {int a;a = d1.a;d1.a = d2.a;d2.a = a;}private static void function2(Demo d1, Demo d2) {Demo temp;temp = d1;d1 = d2;d2 = temp;}@Testpublic void test1() {Demo d1 = new Demo(1);Demo d2 = new Demo(2);System.out.println(d1.a + " " + d2.a);function1(d1, d2);System.out.println(d1.a + " " + d2.a);}@Testpublic void test2() {Demo d1 = new Demo(1);Demo d2 = new Demo(2);System.out.println(d1.a + " " + d2.a);function2(d1, d2);System.out.println(d1.a + " " + d2.a);}}

他们的观点如下:执行上面的代码test1(),调用function1()函数以前输出的结果是1、2,调用function1()函数之后输出的结果会是2、1,可见在函数内对d1和d2的改变反映到了原来的变量上,要不是不会输出2、1的。

这种解释是很迷惑人的,看上去好像很正确,但test2()代码会很好的反驳上面的观点

执行上面的代码,调用function2()前后程序输出的都是1、2,此程序试图通过调用function2()交换d1和d2,但是没有成功,为什么呢?因为d1和d2是值传递,function2()中的d1和d2是test2()函数中d1和d2的副本,调用完function2()不会对test2()中的变量产生影响。再看示例二中,function1()函数内改变的并不是d1和d2本身的值,而是d1和d2指向的对象的值,调用完function1()后d1和d2仍然指向函数调用前的堆地址,即函数参数是栈中的d1和d2,而不是堆中d1和d2指向的对象,即使你在函数中改变了堆中的对象,但没有改变函数参数的值。所以示例二并不是什么引用传递;可见java中只有值传递。

总结

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

转载链接:https://www.cnblogs.com/kaililikai/p/5885744.html

请注意,java中没有引用传递相关推荐

  1. java中是引用传递还是值传递....

    刚才与Z师兄聊天,他提问: 你说java中是引用传递还是值传递啊? 当时俺搞混了这个"传递"的意思, 本来以为是对象的实例化比如: abc a=new abc(); 这个a 是引用 ...

  2. java引用传递_理解Java中的引用传递和值传递

    关于Java传参时是引用传递还是值传递,是一个讨论比较多的话题, 有说Java中只有值传递,也有些地方说引用传递和值传递都存在,本篇记录思考过程,不保证正确性, 感兴趣的同学一起讨论. 1.基本类型和 ...

  3. Java中的引用传递

    除了基本数据类型和String类对象,其他引用类型的对象都可以进行引用传递.数组也是引用类型. 比如: 通过传入对象的方法,修改该对象的值. 这个时候,基本数据类型和String的对象就不可以进行引用 ...

  4. java值传递和引用传递的例子,Java中的值传递和引用传递实例介绍

    代码如下: package Object.reference; public class People { private String name; private int age; public P ...

  5. 详解Java中的值传递

    前面所需的概念 首先我们来讲解传递这个概念,分为俩种 形参 实参 值传递 引用传递 形参&实参 方法的定义中可能会用到参数(有参的方法),参数在编程语言中又分为实参和形参, 形参:形式参数,指 ...

  6. java中是值传递引用传递_Java是按值传递而不是按引用传递

    java中是值传递引用传递 One of the biggest confusion in Java programming language is whether java is Pass by V ...

  7. Java方法中的引用传递

    Java方法中的引用传递 背景 基础知识 探究 定义Person类 写定义测试类进行测试 运行结果 分析 另一个例子 运行结果 分析和结论 背景 最近复习java相关的知识,看到有一个资料里写道:Ja ...

  8. 【Java基础】Java中的值传递、引用传递

    Java中的值传递.引用传递 对于一个方法而言,参数是为该方法提供信息的,而不是想让该方法改变自己.--<Java编程思想> 值传递是对基本型变量而言的,传递的是该变量的一个副本,改变副本 ...

  9. 一文彻底搞懂Java中的值传递和引用传递!

    关于Java中方法间的参数传递到底是怎样的.为什么很多人说Java只有值传递等问题,一直困惑着很多人,甚至我在面试的时候问过很多有丰富经验的开发者,他们也很难解释的很清楚. 我很久也写过一篇文章,我当 ...

最新文章

  1. BDB (Berkeley DB)数据库简单介绍(转载)
  2. Docker 基本用法
  3. 【数据结构和算法笔记】:图的深度优先搜索(DFS)
  4. html css 开发商业站点,Accp60_S1使用HTML语言和CSS开发商业站点(阅读).doc
  5. 凸优化第四章凸优化问题 4.7向量优化
  6. xx闪购—主体选项卡
  7. 机器学习——LBP特征
  8. 关于php后台的知识,xfplay影音先锋画面声音不同步的处理教程 爱狐网 (‾◡◝)...
  9. 敏捷开发模式下测试策略
  10. iOS转场动画之微信朋友圈图片查看器
  11. 什么是一对一电脑无人直播?
  12. iOS 面试基础题目
  13. 使用CANoe作为网关的FlexRay - FlexRay同步
  14. 交通·未来第4期:利用新兴交通数据进行大规模路网交通管理—以无人车和网约车数据为例...
  15. composer [InvalidArgumentException] Could not find package laravel/laravel with stability stable.
  16. ZOJ:1203 Swordfish
  17. P1909 [NOIP2016 普及组] 买铅笔 优雅算法
  18. STL系列之十 全排列(百度迅雷笔试题)
  19. Nhibernate介绍与使用
  20. c语言 指针不能赋值吗,程序员编程C语言指针答疑:指针赋值没那么简单

热门文章

  1. 创宇云蜜罐成为华为云联营商品,合力提供网络安全服务
  2. 利用ADB固定Android手机的CPU频率
  3. 第50篇 Android Studio实现生命数字游戏(五)计算星座数
  4. 2022年机修钳工(中级)考试题库及模拟考试
  5. 洛谷 P1562 智破连环阵 题解(搜索)
  6. 苹果ios系统企业级开发者授信下载app时出现:‘此app开发者需要更新’‘出现一朵云app无法打开’有的手机可以打开有的手机无法打开情况解决方案
  7. 硬路由、软路由、主路由、旁路由对比分析
  8. 记录一下在云服务器上配置MYSQL主从。
  9. Did China Eat America’s Jobs?
  10. c语言编程入门教程+网易,人话讲编程·C语言入门:第一讲,Hello World