Java方法中的引用传递

  • 背景
    • 基础知识
    • 探究
      • 定义Person类
      • 写定义测试类进行测试
      • 运行结果
      • 分析
      • 另一个例子
      • 运行结果
    • 分析和结论

背景

最近复习java相关的知识,看到有一个资料里写道:Java 中不存在引用传递。于是又看了一些帖子,有些说Java中只有值传递,而有些说二者都有;这难免让人感到疑惑,大概在这里总结一下。

基础知识

Java中,除基本类型外,其他类型都是以引用的方式传递变量。

值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。

引用传递中,形参实参指向同一个对象,形参的操作会改变实参对象。

对象的传递则和基本类型不同,传递的是该对象的一个引用,即指向对象的一个指针。也就是说,传递到方法中的对象和外部的对象是同一个对象,在方法内部对对象的修改,在方法外部会有所体现。

探究

定义Person类

public class Person {public String name = "Person";public int age = 20;@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}
}

写定义测试类进行测试

public class Test {public static void main(String[] args) {Person p = new Person();System.out.println("方法传递前Person为:" + p);func(p);System.out.println("方法传递后Person为:" + p);}public static void func(Person p) {p.name = "被修改的名字";}
}

运行结果

分析

传递到方法中的对象和方法外部的对象是同一个对象, 在方法内修改对象的属性,方法外的对象也会变化。那为什么会说Java中不存在引用传递呢?请看下面的例子

另一个例子

public class Test {public static void main(String[] args) {Person p = new Person();System.out.println("方法传递前Person为:" + p);func(p);System.out.println("方法传递后Person为:" + p);}public static void func(Person p) {p = new Person();p.name = "被修改的名字";}
}

运行结果

分析和结论

再看一下引用传递的定义:引用传递中,形参实参指向同一个对象,形参的操作会改变实参对象。

而在第二次的测试中,可以看到,在方法内对传入的引用的改变, 并没有在外部被体现出来。在函数内,传入的参数指向了另一个对象,但在方法外部外部,指向原对象的引用并没有跟着改变。

引用传递严格来说是C++中的概念,而Java中没有明确的定义。在C++ 中, 对象的传递可以通过 & 运算符直接将地址传递给函数,这意味着,如果在函数内将另外一个对象赋给了传入的参数,那么在函数外面仍然是可以被影响的到的。这也就是与Java中不同而引起争议的地方。

可以得出:中Java中确实不存在严格意义上的引用传递

Java方法中的引用传递相关推荐

  1. C#中方法参数的引用传递、值传递。

    一.值类型和引用类型 C# 中的类型一共分为两类,一类是值类型(Value Type),一类是引用类型(Reference Type). 值类型包括结构体(struct)和枚举(enum). 引用类型 ...

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

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

  3. Java方法中的参数太多,第1部分:自定义类型

    我认为构造函数和方法中冗长的参数列表是Java开发中的另一个" 危险信号 ",就逻辑和功能而言,它们不一定是"错误的",但通常暗示当前或将来出现错误的可能性很高 ...

  4. Java方法中的参数太多,第5部分:方法命名

    在上一篇文章 (有关处理Java方法中过多参数的系列文章的 第4部分 )中,我将方法重载视为一种向客户提供需要较少参数的方法版本或构造函数的方法. 我描述了该方法的一些缺点,并建议从方法重载中摆脱出来 ...

  5. python中、变量指向的对象可以发生变化吗_python中的引用传递,可变对象,不可变对象,list注意点...

    python中的引用传递 首先必须理解的是,python中一切的传递都是引用(地址),无论是赋值还是函数调用,不存在值传递. 可变对象和不可变对象 python变量保存的是对象的引用,这个引用指向堆内 ...

  6. Java方法中的参数太多,第8部分:工具

    在我的系列文章的前七篇文章中,有关处理Java方法中期望的参数过多的内容集中在减少方法或构造函数期望的参数数量的替代方法上. 在本系列的第八篇文章中,我将介绍一些工具,这些工具可帮助您确定可能存在过多 ...

  7. Java方法中的参数太多,第4部分:重载

    期望将过多的参数传递给Java方法的问题之一是,该方法的客户端很难确定它们是否以适当的顺序传递了适当的值. 在以前的文章中,我描述了如何使用自定义类型 , 参数对象和构建器来解决此问题. 解决此问题的 ...

  8. Java方法中的参数太多,第7部分:可变状态

    在我的系列文章的第七篇中,有关解决Java方法或构造函数中过多参数的问题 ,我着眼于使用状态来减少传递参数的需要. 我等到本系列的第七篇文章来解决这个问题的原因之一是,它是我最不喜欢的减少传递给方法和 ...

  9. Java方法中的参数太多,第6部分:方法返回

    在当前的系列文章中,我正在致力于减少调用Java方法和构造函数所需的参数数量,到目前为止,我一直专注于直接影响参数本身的方法( 自定义类型 , 参数对象 , 构建器模式 , 方法重载和方法命名 ). ...

最新文章

  1. DoubleViewPager
  2. android 的listactivity
  3. x = x (x-1)
  4. AutoML简要概述
  5. java如何打logo,利用java给网站图片打上文本或图片logo
  6. SQL中的撤销索引、表以及数据库
  7. gdb 查看结构体地址内容_程序员的术与道:术——gdb基本操作
  8. 前端学习(1670):前端系列实战课程之核心运动原理
  9. mysql修改字段默认值_MySQL增删改查操作
  10. UE4 多线程使用tip
  11. Maven配置nexus
  12. Redis: Redis支持五种数据类型
  13. web浏览器_2019版 web 浏览器现状
  14. No New-Net
  15. mac os x 系统安装 genymotion android 模拟器
  16. 尝鲜ESXi7.0,手工注入LSI MegaRAID 9260-8i驱动,封装iso安装文件
  17. Leo2DNT(雷傲论坛转DiscuzNT)1.0转换程序发布
  18. Html 在线预览word、excel、pdf等文档
  19. ajax回调函数的使用;ajax请求成功后对数据的再次使用
  20. arduino步进电机程序库_Arduino步进电机控制示例

热门文章

  1. 十大经典网络营销案例(下)
  2. 上冠热力不减,传奇即将诞生!总决赛数字凭证限时领取!
  3. 如何去脸上的【收获一份爱的礼物】
  4. Survivor区放不下存活对象,那么存活对象直接就分配到老年代?
  5. Python安装教程(2021)
  6. 根据主键ID修改已经存在的数据
  7. NumPy学习笔记(四)—— argmax()函数
  8. 尿频中医如何辩证治疗
  9. 用matlab如何画根轨迹图,MATLAB绘制根轨迹ppt课件
  10. 思科笔记-One 什么是ip地址,ip地址分类和范围,网络手机流量单位换算