科普:

  • 值传递(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 方法中,我们可以看到注释:

  1. 如果是引用传递,那么我把你的家整个都变为了别人的家,那么你的家对象上现在应该存放的是别人的家,并且你家(即 别人家)的电瓶也应该被我偷了。
  2. 如果是值传递,那么我只是把你的家对象参数复制了一个新的,这个新的家我设为了别人的家,我偷一个跟你家一模一样的别人家的电瓶,你家的电瓶应该不会变。

运行结果:

别人的家的电瓶被偷了!
你的家的电瓶还在哟~

根据运行结果来看,很显然,是第二种情况,也就是值传递,我偷的是一个跟你家一模一样的别人家的电瓶,而你家的电瓶还在。

结论

Java 中只有值传递

【Java思考】Java 中的实参与形参之间的传递到底是值传递还是引用传递呢?的更多相关文章

  1. C/C++中的实参和形参

    今天突然看到一道关于形参和实参的题,我居然不求甚解.藐视过去在我的脑海里只有一个参数的概念,对于形参和实参的区别还真的不知道,作为学习了几年C++的人来说,真的深深感觉对不起自己对不起C++老师  T ...

  2. C语言学习笔记 (003) - C/C++中的实参和形参(转)

    今天突然看到一道关于形参和实参的题,我居然不求甚解.藐视过去在我的脑海里只有一个参数的概念,对于形参和实参的区别还真的不知道,作为学习了几年C++的人来说,真的深深感觉对不起自己对不起C++老师  T ...

  3. C/C++中的实参和形参,重点以及盲点,自己以前未知的

    C/C++中的实参和形参   今天突然看到一道关于形参和实参的题,我居然不求甚解.藐视过去在我的脑海里只有一个参数的概念,对于形参和实参的区别还真的不知道,作为学习了几年C++的人来说,真的深深感觉对 ...

  4. java和js中JSONObject,JSONArray,Map,String之间转换

    --------------------------------------------------Java中--------------------------------------------- ...

  5. 理解Java中的引用传递和值传递

    关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题,有论坛说Java中只有值传递,也有些地方说引用传递和值传递都存在,比较容易让人迷惑.关于值传递和引用传递其实需要分情况看待,今天学习 ...

  6. (转载)理解Java中的引用传递和值传递

      关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题,有论坛说Java中只有值传递,也有些地方说引用传递和值传递都存在,比较容易让人迷惑.关于值传递和引用传递其实需要分情况看待,今天 ...

  7. Java中的值传递与引用传递

    1.基本类型和引用类型在内存中的保存 Java中数据类型分为两大类,基本类型和对象类型.相应的,变量也有两种类型:基本类型和引用类型. 基本类型的变量保存原始值,即它代表的值就是数值本身: 而引用类型 ...

  8. JAVA中值传递,引用传递

    刚在写一个用例,需要在方法中改变传递的参数的值,可是java中只有传值调用,没有传址调用.所以在java方法中改变参数的值是行不通的.但是可以改变引用变量的属性值. 可以仔细理解一下下面几句话: 1. ...

  9. python中函数定义之实参、形参

    一般在函数的定义中,会有一类变量---形参,它是函数完成其工作的一项信息.实参往往是调用函数时传递给函数的信息.我们在调用函数时,将要让函数使用的信息放在括号内.例如定义一个函数def greet_u ...

随机推荐

  1. 赛艇表演 51nod提高组模拟试题

    AC通道 题目描述 小明去某个地区观看赛艇比赛,这个地区共有n个城市和m条道路,每个城市都有赛艇比赛,在第i个 城市观看赛艇表演的价钱为ai, 去其他城市观看也需要支付赛艇表演的价格.任意两个城市之间 ...

  2. [256个管理学理论]004.鲶鱼效应(Catfish Effect)

    鲶鱼效应(Catfish Effect) 来自于大洋彼岸的让你看不懂的解释: 鲶鱼效应(Catfish Effect):鲶鱼在搅动小鱼生存环境的同时,也激活了小鱼的求生能力.鲶鱼效应是采取一种手段或措 ...

  3. Python数据分析:pandas玩转Excel(三)

    将对象写入Excel工作表. 要将单个对象写入 Excel .xlsx 文件,只需指定目标文件名即可.要写入多个工作表,必须创建具有目标文件名的ExcelWriter对象,并在文件中指定要写入的工作表 ...

  4. GDI泄漏排查经验零散总结

    1.GDI对象以及释放方法: GDI对象 产生方法 销毁方法 位图(HBITMAP) CreateBitmap,CreateBitmapIndirect, CreateCompatibleBitmap ...

  5. shell日期格式化、加减运算

    #!/bin/bash echo i love you输出:i love you =======================================反引号的作用============== ...

  6. "锁定文件失败 打不开磁盘或它所依赖的某个快照磁盘。模块启动失败。未能启动虚拟机"--解决方法

    今天正在使用kali的时候,电脑突然死机了..强制重启,在进入虚拟机发现报错: "锁定文件失败 打不开磁盘或它所依赖的某个快照磁盘.模块启动失败.未能启动虚拟机." 1.问题起因 ...

  7. 使用turtle库绘制图形

    1.使用turtle库绘制红色五角星图形 import turtle n = eval(input("请输入五角星的长度")) turtle.begin_fill() #开始填充颜 ...

  8. Java实现 蓝桥杯VIP 算法训练 比赛安排

    问题描述 设有有2 n(n<=6)个球队进行单循环比赛,计划在2 n – 1天内完成,每个队每天进行一场比赛.设计一个比赛的安排,使在2 n – 1天内每个队都与不同的对手比赛. 输入格式 输入 ...

  9. Java实现 洛谷 P1010 幂次方

    输入输出样例 输入 #1 1315 输出 #1 2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0) import java.util.Scanner; pu ...

  10. Java实现有理数的循环节

    1/7 = 0.142857142- 是个无限循环小数. 任何有理数都可以表示为无限循环小数的形式. 本题目要求即是:给出一个数字的循环小数表示法. 例如: 输入: 1,5 则输出: 0.2 输入: ...