在计算机科学中,参数传递的形式主要有以下2种: 值调用和引用调用,为了说明Java在传参过程中的参数传递方式,我们首先需要对上述中2种调用形式的定义做清晰的介绍

定义

现给出两者的定义:值调用(Call by Value): 指函数接收的是调用者提供的实参变量的值

引用调用(Call by reference): 指函数接收的是调用者提供的实参变量的地址

两种传递方式名词中的“值”和“引用”,是对函数调用时对实参求值策略的分类,而不是指实参的类型。所以,不能依据传入的实参类型来判断是何种调用方式。常见的理解错误,认为Java中的实参为基本数据类型即值调用,实参为引用类型即为引用调用。实际上,在Java中只有值调用

两种求值策略区别如下:

值调用: 被调函数的形参得到的是实参变量的值的副本,无法在被调函数中去修改实参的值

引用调用: 被调函数的形参得到的是实参变量本身,故可以通过被调函数中修改实参变量的值

Java 只有值调用

具体到Java中,其函数调用时的参数传递,是值调用还是引用调用?我们将分基本类型和引用类型分别讨论基本数据类型

对于基本数据类型(byte, short, int, long, float, double, char, boolean)而言(也称为值类型),形参得到是将实参变量的值的副本,显然被调函数中对形参的修改无法更新作用于实参,所以,对于实参为基础类型的情况而言,其参数调用类型为值调用引用类型

对于实参为引用类型时,根据上文可知,我们不能直接根据实参类型来断定其是引用调用

在Java中引用类型的变量的值,实际上存放的是所指对象的地址,其形参的得到也即该值(实参所指对象的地址)的拷贝,由于此时形参引用和实参引用都是指向同一对象,则在被调函数通过形参的引用变量修改所指对象的数据时,实参的引用同样可以获得对所指对象的相应修改。故很多人据此错误得出其为引用调用。其实这是错误的,因为正如上文所言,形参做的修改之所以能被实参所使用,是因为两者均指向同一个对象,其传递的依然是引用变量的值(即,对象地址),而不是传递引用变量的地址。所以如果在被调函数中,修改形参的引用变量的值,即改变形参引用变量其所指向的对象,其结果并不会改变实参的引用变量所指向的对象。

综上所述,对于实参为引用类型的情况而言,其参数调用类型同样为值调用,只不过其值是对象的地址

Note不可变对象

不可变对象,即对象一旦被创建后它的状态(对象的属性数据)就不能被改变。以下类的实例为不可变的:String, 基本类型的包装器, BigInteger和BigDecimal等

将不可变对象作为实参传入方法后,实参并不会被方法中的操作所修改,因为其为不可变对象,在方法中,欲改变该对象的操作实际会生成一个新对象,并让形参指向该新对象。所以,如前文所述,形参引用变量指向其他对象,并不会影响实参的指向数组

Java中,数组类型为对象。故可按照实参为引用类型进行考虑分析。即,将数组作为形参传入方法后,在方法中对数组元素的修改,该修改可以体现在原实参数组中。但是如果在方法中,修改形参引用,使其指向其他数组对象,则不会影响原实参数组的内容

java是值调用_Java 只有值调用相关推荐

  1. 用java的io做一个代码计数器,如何制作Java页面计数器_java

    大庆采油六厂采油工艺研究所 王兵 王波 常常逛WWW的人,一定对许多起始页上的计数器感兴趣.每当你光临某个站点的起始页时,它的计数器就很亲切地告诉你,从某年某月某日开始,你是第几位光临的人.你可能也想 ...

  2. 【源码+图片素材+详细教程】Java游戏开发_Java开发经典游戏飞翔的小鸟_飞扬的小鸟_Java游戏项目Flappy Bird像素鸟游戏_Java课程设计项目

    课程目标: 1.通过本课程的学习巩固Java的相关基础知识,例如循环判断,数组和集合的使用,对象的继承,接口的实现,窗口的创建,事件监听,图形绘制. 2.完成小鸟的移动,管道自动生成.碰撞死亡,计分系 ...

  3. 【源码+教程】Java桌球游戏_Java初级项目_Java练手项目_Java项目实战_Java游戏开发

    今天分享的Java开源游戏项目是桌球游戏,初学者也可以用来练习喔~课程详细讲解了一个桌球游戏的编写思路和流程,即使你刚学Java没多久,也可以跟随该教程视频完成属于你自己的桌球游戏!同时,还可以加深和 ...

  4. 【源码+项目部署】Java课程设计项目_Java人力资源管理系统

    对就业和毕业都有帮助的Java实战项目来咯--人力资源管理系统! 人力资源管理系统 |Java项目2小时上手编写_源码+数据库拿走不谢!Java实战项目_Java开发https://www.bilib ...

  5. java 传入参数_java参数怎么传递参数

    计算机语言给子程序传递参数的方法有两种: 按值传递(call-by-value):这种方法将一个参数值复制成子程序的正式参数.这样,对子程序的参数的改变不影响调用它的参数. 引用调用(call-by- ...

  6. java super用法_Java基础面试题汇总

    blog.csdn.net/ThinkWon/article/details/104390612 Java概述 何为编程 编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结 ...

  7. java可选参数_Java可选

    java可选参数 In this article, we'll explore Java Optional class which was introduced in Java 8. 在本文中,我们将 ...

  8. java核心技术卷一_java核心技术卷一

    第一章 "面向对象的"木匠始终关注的是所制作的椅子,第二位才是所使用的工具: Java有个例程库,用于处理像HTTP和FTP之类的TCP/IP协议. java编译器能够检测许多在其 ...

  9. java 字符串总结_Java中字符串(String)总结

    先说说JDK API: JDK中包含大量的API类库,所谓API(Application Programming Interface,应用程序编程接口,这些功能以类的形式封装). JDK API包含的 ...

最新文章

  1. 从RNN一步步通俗易懂T理解LSTM
  2. element ui 中el-input搜索输入框或者普通输入框无法输入的问题讨论
  3. openfeign调用服务是否需要网关_阿里新一代微服务解决方案:Spring Cloud Alibaba
  4. 详解iPhone开发之Objective-C和 C 混编
  5. 四、CXF WebService中传递复杂类型对象
  6. matlab中a k,Python:相当于Matlab的大型数组的svds(A,k)?
  7. cnblogs 博客园模板技巧
  8. 两组树形数据的比对_Python数据分析-可视化“大佬”之Seaborn
  9. Python笔记-基础语法(个人资料整理)
  10. Latex:字体设置
  11. 仓库管理数据库系统设计
  12. Logistic回归分类器
  13. 苹果8a1660是什么版本_苹果a1660是什么版本
  14. C#从sqlite3中读数据到DataTable中报错 :System.Data.ConstraintException:“未能启用约束。一行或多行中包含违反非空、唯一或外键约束的值。
  15. stm32程序flash下载和sram运行
  16. 模拟登陆广工统一认证系统
  17. 世界上第一台电子计算机的研制目的,最初研制电子计算机的目的
  18. 淘晶驰串口屏入门(四)进度条、滑块、定时器、单选框、复选框、二维码
  19. 如何取消Office 正版增值验证
  20. nodemailer如何配置公司邮箱发送邮件

热门文章

  1. flutter 获取设备屏幕大小
  2. MarkDown/Html在线转换(支持代码高亮,可复制到微信公众号、今日头条)
  3. web.xml文件头出错
  4. sql server存储过程中解决单引号的问题
  5. 数据库基础知识——变量
  6. Leetcode--210.课程表Ⅱ
  7. MVC里面写html获取不到input,asp.net-mvc – ASP.Net [HiddenInput]数据属性在Razor中用Html.EditorForModel渲染时不起作用?...
  8. java 中文域名转码_转换java方法
  9. 计算机网络画出发送窗口变化,2010年7月计算机网络原理试题及答案
  10. python 查询sqlserver 视图_SQL Server 2017 数据库教与学(教学大纲,含Python+SQL Server案例)...