【Java思考】Java 中的实参与形参之间的传递到底是值传递还是引用传递呢?
科普:
- 值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
- 引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
| 值传递 | 引用传递 | |
|---|---|---|
| 根本区别 | 会创建副本(Copy) | 不创建副本,直接引用 |
| 效果 | 函数中无法改变原始对象 | 函数中可以改变原始对象 |
Java 中的实参与形参之间的传递到底是值传递还是引用传递呢?
其实之前我和大多数人一样认为:传递的参数如果是“基本数据类型”,那就是“值传递”,如果是“引用类型”(即 对象),那就是“引用传递”。
但是昨天我突然觉得:好像。。。不一定!
诶,别急着怼我说:Nemo!你传递过对象没啊,把对象传过去,修改对象的属性值,属性值就是的的确确的修改了啊!
诶,你说的没错,确实是修改了,但是你也说了是修改对象的属性值,传过去的是对象地址,而你的实际操作并没有对你传入的地址进行修改,只是修改了对象地址下面的属性值。
如果只是修改对象地址下面的属性值的话,那么值传递和引用传递有差吗?
值传递:复制对象地址给函数,函数修改对象地址下面的属性值。
引用传递:引用对象地址给函数,函数修改对象地址下面的属性值。
这两者有差吗,无论是复制还是引用,传入的对象地址都没有改变,改变的只是对象地址下面的属性值。
类比:我们可以类比一下,你家的地址是“北京市海淀区清华园1号”。
引用传递:你给我引用你的地址,我过去你的地址那,打开你家的门,偷你家电动车的电瓶。
值传递:你不给我你的地址,我从网上找到你的地址,复制一份,过去你的地址那,打开你家的门,偷你家电动车的电瓶。
你瞧瞧,这两者有差吗?无论是怎样拿到你家的地址,你家的电瓶我要定了啊,你家的电瓶都会被修改啊。
举例代码:
package temp;
/**
* @author Nemo
* @date 2020/6/22
*/
public class ValueTransfer {
public static void main(String[] args) {
Home yourHome = new Home("你的家");
Nemo nemo = new Nemo();
nemo.steal(yourHome);
yourHome.show();
}
}
class Home {
public String name;
public boolean battery = true;
public boolean isBattery() {
return battery;
}
public void setBattery(boolean battery) {
this.battery = battery;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Home(String name) {
this.name = name;
}
public void show() {
if (this.isBattery()) {
System.out.println(name + "的电瓶还在哟~");
} else {
System.out.println(name + "的电瓶被偷了!");
}
}
}
class Nemo {
public void steal(Home home) {
//如果是引用传递的话,那么我把你的家整个都变为了别人的家,那么你的家对象上现在应该存放的是别人的家
//如果是值传递的话,那么我只是把你的家对象复制了一个新的,这个新的家是别人的家,我偷一个跟你家一模一样的别人家的电瓶,你家的电瓶应该不会变
home = new Home("别人的家");
home.battery = false;
home.show();
}
}
在 Nemo 类的 steal 方法中,我们可以看到注释:
- 如果是引用传递,那么我把你的家整个都变为了别人的家,那么你的家对象上现在应该存放的是别人的家,并且你家(即 别人家)的电瓶也应该被我偷了。
- 如果是值传递,那么我只是把你的家对象参数复制了一个新的,这个新的家我设为了别人的家,我偷一个跟你家一模一样的别人家的电瓶,你家的电瓶应该不会变。
运行结果:
别人的家的电瓶被偷了!
你的家的电瓶还在哟~
根据运行结果来看,很显然,是第二种情况,也就是值传递,我偷的是一个跟你家一模一样的别人家的电瓶,而你家的电瓶还在。
结论
Java 中只有值传递。
【Java思考】Java 中的实参与形参之间的传递到底是值传递还是引用传递呢?的更多相关文章
- C/C++中的实参和形参
今天突然看到一道关于形参和实参的题,我居然不求甚解.藐视过去在我的脑海里只有一个参数的概念,对于形参和实参的区别还真的不知道,作为学习了几年C++的人来说,真的深深感觉对不起自己对不起C++老师 T ...
- C语言学习笔记 (003) - C/C++中的实参和形参(转)
今天突然看到一道关于形参和实参的题,我居然不求甚解.藐视过去在我的脑海里只有一个参数的概念,对于形参和实参的区别还真的不知道,作为学习了几年C++的人来说,真的深深感觉对不起自己对不起C++老师 T ...
- C/C++中的实参和形参,重点以及盲点,自己以前未知的
C/C++中的实参和形参 今天突然看到一道关于形参和实参的题,我居然不求甚解.藐视过去在我的脑海里只有一个参数的概念,对于形参和实参的区别还真的不知道,作为学习了几年C++的人来说,真的深深感觉对 ...
- java和js中JSONObject,JSONArray,Map,String之间转换
--------------------------------------------------Java中--------------------------------------------- ...
- 理解Java中的引用传递和值传递
关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题,有论坛说Java中只有值传递,也有些地方说引用传递和值传递都存在,比较容易让人迷惑.关于值传递和引用传递其实需要分情况看待,今天学习 ...
- (转载)理解Java中的引用传递和值传递
关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题,有论坛说Java中只有值传递,也有些地方说引用传递和值传递都存在,比较容易让人迷惑.关于值传递和引用传递其实需要分情况看待,今天 ...
- Java中的值传递与引用传递
1.基本类型和引用类型在内存中的保存 Java中数据类型分为两大类,基本类型和对象类型.相应的,变量也有两种类型:基本类型和引用类型. 基本类型的变量保存原始值,即它代表的值就是数值本身: 而引用类型 ...
- JAVA中值传递,引用传递
刚在写一个用例,需要在方法中改变传递的参数的值,可是java中只有传值调用,没有传址调用.所以在java方法中改变参数的值是行不通的.但是可以改变引用变量的属性值. 可以仔细理解一下下面几句话: 1. ...
- python中函数定义之实参、形参
一般在函数的定义中,会有一类变量---形参,它是函数完成其工作的一项信息.实参往往是调用函数时传递给函数的信息.我们在调用函数时,将要让函数使用的信息放在括号内.例如定义一个函数def greet_u ...
随机推荐
- 5.List链表类型介绍和操作
数据类型List链表 (1)介绍 list类型其实就是一个双向链表.通过push,pop操作从链表的头部或者尾部添加删除元素.这使得list既可以用作栈,也可以用作队列. 该list链表类型应用场景: ...
- 4.Linux的目录结构
Linux的目录结构 (1)"/"目录 Linux文件系统的入口,也是出于最高一级的目录 (2)"/bin" 基础系统所需要的那些命令位于此目录.也是最小系统所 ...
- Spring_使用JdbcTemplate和JdbcDaoSupport
1.JdbcTemplate 简化 JDBC 模板查询 ①每次使用都创建一个 JdbcTemplate 的新实例, 这种做法效率很低下.②JdbcTemplate 类被设计成为线程安全的, 所以可以再 ...
- 资源在windows编程中的应用----菜单
资源在Windows编程中的应用 资源 加速键.位图.光标.对话框.菜单.字符串.工具条 1.菜单的创建 菜单由以下组成部分: (1)窗口主菜单条 (2)下拉式菜单框 (3)菜单项热键标识 (4)菜单 ...
- Redis详解(十三)------ Redis布隆过滤器
本篇博客我们主要介绍如何用Redis实现布隆过滤器,但是在介绍布隆过滤器之前,我们首先介绍一下,为啥要使用布隆过滤器. 1.布隆过滤器使用场景 比如有如下几个需求: ①.原本有10亿个号码,现在又来了 ...
- SpringBoot整合Flyway(数据库版本迁移工具)
简介 在团队开发当中,有可能每个人都是使用自己本地的数据库.当数据库的表或者字段更新时,往往需要告知团队的其他同事进行更新. Flyway数据库版本迁移工具,目的就是解决该问题而诞生的(我自己想的). ...
- Java实现 LeetCode 657 机器人能否返回原点(暴力大法)
657. 机器人能否返回原点 在二维平面上,有一个机器人从原点 (0, 0) 开始.给出它的移动顺序,判断这个机器人在完成移动后是否在 (0, 0) 处结束. 移动顺序由字符串表示.字符 move[i ...
- Java实现 LeetCode 324 摆动排序 II
324. 摆动排序 II 给定一个无序的数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]- 的顺序. 示例 1: 输入: n ...
- Java实现 LeetCode 137 只出现一次的数字 II(二)
137. 只出现一次的数字 II 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空 ...
- java实现第七届蓝桥杯反幻方
反幻方 题目描述 我国古籍很早就记载着 2 9 4 7 5 3 6 1 8 这是一个三阶幻方.每行每列以及对角线上的数字相加都相等. 下面考虑一个相反的问题. 可不可以用 1~9 的数字填入九宫格. ...