Java方法的参数传递机制详解

新手友好的PythonUI库PySimpleGUI项目已下架,切换4.50.6版本的方法 过期后,如果还想使用 PySimpleGUI,则需要切换到版本 4,而版本 4 在 GitHub 上有很多社区维护的版本可以选择。开发团队尝试了 7 年,但始终没能获得足够的收入来维持项目的运营,尤其是开源项目通常面临资金不足的问题。商业许可证是永久有效的,用户可以在支持期结束后依然使用应用程序,并会提供离线版本的文档以供参考。尽管项目关闭,但对购买了商业许可证的用户,团队仍会在接下来的一年内提供支持。 阅读详情

本文是读 李刚 编写的 《疯狂Java讲义》中的5.2.2节的读书笔记的整理;

Java里的参数传递类似于《西游记》里的孙悟空,孙悟空复制一个假的孙悟空,这个假孙悟空具有和真孙悟空相同的能力,可除妖或被砍头,但不管这个假孙悟空遇到什么事,真孙悟空不会受到任何影响。与此类似,传入方法的是实际参数值得复制品,不管方法中对这个复制品如何操作,实际参数值本身不会受到任何影响

---李刚

无论是基本类型的参数传递还是引用类型的参数传递;本质都是值传递,在引用类型的参数传递时,容易给人造成困惑的主要原因是,我们要分清,在创建一个对象是,引用变量保持在栈内存中,在堆内存中保存的是真是创建出来的对象,并且栈内存中保存了对象在堆内存中的首地址,那么在参数传递时实际是传递的栈内存中的对象首地址,这样就会造成方法中的形参也会指向堆内存中的实际对象,因此在方法中对对象的修改会影响到实际堆内存中的对象;

1. 基本类型的参数传递问题图解:

public class NewObjectTest {

	public static void swap(int a,int b){
		int tmp = a;
		a = b;
		b = tmp;
		System.out.print("swap 方法中,a 的值是: "+a+"; b 的值是: "+b);
	}
	public static void main(String[] args) {
		int a=5, b=10;
		swap(a,b);
		System.out.print("交换结束后,a 的值是: "+a+" b 的值是: "+b);
	}
}
输出结果为:

swap 方法中,a 的值是: 10; b 的值是: 5
交换结束后,a 的值是: 5 b 的值是: 10
1.当程序进入到main方法中,会在main栈区保持main()方法中的局部变量 a 和 b (a=5,b=10) ;

2.在main方法中调用 swap(a,b)方法,此时开辟一个swap的栈区来保持形参 a 和 b;并将main()方法栈中a和b变量的值分别赋给swap方法栈中的a和b参数,也就是对 swap方法的a 和b 的形参进行了初始化; 此时系统中存在着 两个a变量和两个b变量,只是存在了不同的方法栈区中;

3.程序在swap中交换 a 和 b 的变量值,此时在swap方法栈中 tmp=5, b=5, a=10; 也就是说swap方法只是交换了swap方法栈区中的变量,并没有交换main栈区中的变量a和b的值;

所以可以清楚的看出,在基本类型的数据是值传递;


2.引用类型的参数传递

class DataWrap{
	private int a;
	private int b;
	
	public DataWrap(int a,int b){
		this.a = a;
		this.b = b;
	}
	public int getA() {
		return a;
	}
	public void setA(int a) {
		this.a = a;
	}
	public int getB() {
		return b;
	}
	public void setB(int b) {
		this.b = b;
	}
	@Override
	public String toString() {
		return "DataWrap [a=" + a + ", b=" + b + "]";
	}
}
public class ReferSwapTest {

	public static void swap(DataWrap dataWrap){	
		int tmp = dataWrap.getA();
		dataWrap.setA(dataWrap.getB());
		dataWrap.setB(tmp);
		System.out.print("swap方法中:"+dataWrap.toString());
	}
	
	public static void main(String[] args) {
		DataWrap dw = new DataWrap(10,20);
		swap(dw);
		System.out.print("swap方法结束后  :"+dw.toString());
	}

}
输出结果为:

swap方法中:DataWrap [a=20, b=10]
swap方法结束后  :DataWrap [a=20, b=10]
给人的错觉:swap中 a 和 b 的值发生了交换,不仅如此,当swap方法执行结束后,main方法中的a和 b的值也发生了改变,这和基本数据类型给人的感觉不同;

原因分析:

1.当程序执行到main方法中的 DataWrap dw = new DataWrap(10,20);时,main方法创建了一个DataWarp对象,并定义了一个dw引用变量来指向DataWarp对象;此时和基本类型有很多的区别;创建一个对象时,系统内存中有两个东西,堆内存中存储了对象本身(a=10,b=20),main栈区内存中保存了引用该对象的引用变量(dw=Ox14ff12);

2.当调用swap(dw); JVM会开辟一个swap方法栈区,并创建引用变量dataWarp,并且会吧dw的值(DataWarp对象在堆内存中的首地址)赋给swap方法栈区中的变量dataWarp, (dataWarp=dw=Ox14ff12); 此时注意:有两个引用变量(main栈区中的引用变量dw, swap栈区中的引用变量dataWarp)同时执行了堆内存中的一个对象;所以操作任何一个引用变量都会影响到在堆内存中的实际对象的值;



实战篇(七):使用Processing和PixelFlow库创建交互式流体太极动画 类:用于配置流体运动的参数,比如圆的位置、半径、运动的角度和速度以及颜色等。类:实现了接口,用于更新流体物理仿真的状态,同时整合声音输入作为流体动态变化的一部分。my_update方法:是流体物理仿真更新的核心,它计算流体粒子的速度和位置,并且将这些数据传递给流体库来模拟流动。现在,让我们进一步分析并解释每个部分的作用以及如何操作。float x;// 圆心位置xfloat y;// 圆心位置y// 半径// 是否是顺时针// 圆周运动,弧上的点位置,以及上一帧的点位置// 角度。 阅读详情

相关推荐

FPGA之全数字锁相环(DPLL)

1. 数字锁相环的基本原理和组成 1.1 锁相环(PLL)的简介 锁相环最开始并不是用在数字电路中,而是模拟短路中。对于模拟电路中的锁相环,大家可以参考这篇文章稍微看一下,数字和模拟只是实现的方法不同,但是原理、步骤还是共同的。关于模拟PLL。可以参考一片文章: http://www.sohu.com/a/190569594_464086 首先在学习数字锁相环之前,我们应该先了解什么是锁相环?锁相...

DBLLLLLLLL的博客 5万+

DataWrap

public class DataWrap implements Comparable<DataWrap>{ int data; String flag; public DataWrap(int data,String flag){ this.data = data; this.flag = flag; } public Str

ITBOY_ITBOX博客 1151

PSF(点扩散函数)与去卷积算法消除图像模糊

本文旨在总结图像处理中使用去卷积的传统方法来进行图像去模糊的相关知识。

m0_53607446的博客 6011

排序算法一(直接选择,堆排序,冒泡排序和快速排序)

对于一个排序算法来说,一般从如下3个方面衡量算法的优劣: 1.时间复杂度:它主要是分析关键字的比较次数和记录的移动次数 2.空间复杂度:分析排序算法中需要多少辅助内存 3.稳定性:若两个记录A和B的关键字相等,排序前后二者的先后次序没有发生变化就称之为稳定排序 现有的排序算法分为:内部排序和外部排序 内部排序:所有的操作都是在内存中完成的,而外部排序需要借助外部存储器(如磁盘等) 外部

BornForIT 2149

中国知网文献引用导入EndNote9.X,Web of science导入endnote以及谷歌学术导入endnote图文详解,全网最细版本适用EndNote9.x,Endnote20版本

在科研中用到EndNote管理文献,遇到插入文献时,中国知网如何将参考文献导进Endnote9.x或者web of sicence,谷歌学术如何将文章,文献导入进文献管理软件EndNote的详细图文2022版本解释,全网最细的笔记教程,值得大家参考收藏学习

sakura的博客 5173

设备管理器找不到蓝牙?从驱动到BIOS的系统排查指南

在Windows系统中,蓝牙功能依赖硬件、驱动、系统服务三层协同工作。设备管理器作为硬件状态的可视化窗口,当蓝牙设备消失时,往往意味着某一层链路中断。常见原因包括BIOS无线开关关闭、驱动异常、蓝牙支持服务被禁用,或系统文件损坏。排查思路应从基础概念出发,先理解蓝牙设备在设备管理器中的四种隐藏位置,再通过扫描硬件、检查BIOS、重装驱动、修复服务等步骤逐层定位。这一方法不仅适用于Windows电脑,也适用于HC-05、ESP32等嵌入式蓝牙模块,因为硬件、协议栈、应用层的故障逻辑相通。掌握这套技术价值在于减

weixin_33377602的博客 266

项目action:前台传多个dataWrap给后台

业务描述:当前台需要向后台传递多个dataWrap时,需要给后台action加上一段方法,才可以获取到额外的dataWrap。 @Override public List&lt;String&gt; getExtendDataWrapName() { List&lt;String&gt; list = new ArrayList&lt;String&gt;(); ...

爱是与世界平行 937

山东大学软件测试实验2——系统功能测试

​ 给出一个被测试的 Web 应用系统(SUT)。http://211.87.232.162:8080/注:友情链接不用延伸测试。针对被测试的 Web 应用系统进行功能测试,发现其存在的缺陷。 ​

m0_74033391的博客 2408

Java 参数传递都是值传递

Java 参数传递都是值传递,验证代码如下 public class ParamTransferTest { public static void swap(int a, int b) { int temp = a; a = b; b = temp; System.out.println("swap() a = " + a + " b = " + b); ...

weixin_30740581的博客 98

8年ES运维经验整理出的Elasticsearch运维手册(超实用)

k1 : 控制非线性词频率归一化(饱和),Elasticsearch中默认值为1.2。用人能看懂的话说就是词语在文档中出现的次数对于得分的重要性。例如说我觉得在某些场景,一个搜索词在文档中出现越多则越接近我希望搜索的内容,就可以将这个参数调大一点。b :控制文档长度对于分数的惩罚力度。变量b处于分母上,它乘以刚刚讨论过的字段长度的比值,Elasticsearch中的b 默认值为0.75。如果b较大,则文档长度相对于平均长度的影响更大。

yonggeit的博客 5273

【图像去噪】基于偏微分方程(PDE)实现图像去噪附matlab代码

在工程应用中,图像信息通过数字图像系统进行处理、存储和传输等加工变换时,由于不可避免地受到噪声干扰,使得原始图像信息产生偏差和失真,给图像的后续处理带来不便,进而影响人们对图像视觉特性的认知程度。因此,为了改善图像的质量效果,提高人们对图像视觉特性的认知度,对图像噪声进行有效去除,降低噪声对图像信息的干扰是很有必要的。近年来,基于偏微分方程( partial differential equation,PDE) ​的图像去噪方法在计算机视觉和图像处理等技术领域得到了广泛的重视,因为它在平滑噪声的同时,能够很

qq_59747472的博客 853

Java参数传递方式详解

Java值传递

qq_56721388的博客 4349

【部署】Docker部署OpenClaw及常见问题解决(win11)

给AI单独开一个隔离的小容器,AI执行所有命令、下载文件都在这个小盒子里,就算AI被诱导执行危险命令,也不会影响你Win11本机的文件和系统,是必开的安全功能。Docker容器里的OAuth回调,会尝试在你Win11本机的1455端口捕获认证信息,但容器和Win11本机的网络隔离,导致浏览器访问不到这个回调地址。「挂载」就是把你Win11本机的文件夹,共享给容器里的「虚拟小电脑」,两边都能读写文件,比如你想让AI操作你D盘里的代码文件,就需要挂载。

海兰 4696

java参数传递机制_Java方法的参数传递机制实例详解

本文实例讲述了java方法的参数传递机制。分享给大家供大家参考,具体如下:参数传递机制对于程序设计语言来说,一般方法(函数)的参数传递有两种:按值传递和按引用传递。按值传递意味着当将一个参数传递给一个方法时,方法接收的是原始值的一个副本。因此,如果方法修改了该参数,仅改变副本,而原始值保持不变。按引用传递意味着当将一个参数传递给一个方法时,方法接收的是原始值的内存地址,而不是值的副本。因此,如果方...

weixin_35976825的博客 404

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

java字符串调用函数参数传递_Java方法的参数传递机制实例详解

本文实例讲述了Java方法的参数传递机制。分享给大家供大家参考,具体如下:参数传递机制对于程序设计语言来说,一般方法(函数)的参数传递有两种:按值传递和按引用传递。按值传递意味着当将一个参数传递给一个方法时,方法接收的是原始值的一个副本。因此,如果方法修改了该参数,仅改变副本,而原始值保持不变。按引用传递意味着当将一个参数传递给一个方法时,方法接收的是原始值的内存地址,而不是值的副本。因此,如果方...

weixin_39869733的博客 604

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

java传递实例_Java方法的参数传递机制实例详解

本文实例讲述了Java方法的参数传递机制。分享给大家供大家参考,具体如下:参数传递机制对于程序设计语言来说,一般方法(函数)的参数传递有两种:按值传递和按引用传递。按值传递意味着当将一个参数传递给一个方法时,方法接收的是原始值的一个副本。因此,如果方法修改了该参数,仅改变副本,而原始值保持不变。按引用传递意味着当将一个参数传递给一个方法时,方法接收的是原始值的内存地址,而不是值的副本。因此,如果方...

weixin_39608457的博客 244

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java实验方法参数传递与递归_Java面向对象——方法详解(方法的所属性&参数传递机制(值传递和引用传递)&参数个数可变的方法&递归方法&方法重载)...

1、方法的所属性永远都不要把方法当成独立存在的实体,正如现实世界由类和对象组成,而方法只能作为类和对象的附属,Java语言里的方法也是一样的。Java语言里的方法的所属性主要体现在如下几个方面。*方法不能独立定义,只能在类里面定义。*方法要么属于类本身,要么属于该类的对象。用static修饰的方法属于类本身,没有用static修饰的方法属于对象。*永远不能独立执行方法,使用static修饰的方法既...

weixin_39984201的博客 317

Java面向对象——方法详解(方法的所属性&参数传递机制(值传递和引用传递)&参数个数可变的方法&递归方法&方法重载)...

1、方法的所属性 永远都不要把方法当成独立存在的实体,正如现实世界由类和对象组成,而方法只能作为类和对象的附属,Java语言里的方法也是一样的。Java语言里的方法的所属性主要体现在如下几个方面。 *方法不能独立定义,只能在类里面定义。 *方法要么属于类本身,要么属于该类的对象。用static修饰的方法属于类本身,没有用static修饰的方法属于对象。 *永远不能独立执行方法,使用stat...

weixin_30909575的博客 226

深入理解Java中方法的参数传递机制

深入理解Java中方法的参数传递机制

平凡的梦 418

java方法的参数传递机制

方法的参数传递机制1.方法的参数传递机制2.实战3.方法的参数传递分析过程 1.方法的参数传递机制 实参是基本数据类型 传递数据值 实参是引用数据类型 传递地址值 特殊的类型:String、包装类等对象不可变性 2.实战 package com.jun; public class MyData { private int a = 10; public int g...

jiegouyihao的专栏 180

【Java SE 基础学习打卡】29 方法的参数传递机制

本文核心明确 Java 唯一传递规则 —— 值传递(传递参数副本),通过生活化类比 + 代码验证,拆解两类场景:基本数据类型传递数据副本,修改形参不影响实参;引用数据类型传递地址副本,修改指向内容影响实参、修改地址则不影响。还解析字符串不可变性的特殊情况,纠正 “引用类型是传引用” 的经典误区,搭配避坑指南,帮助新手彻底理清参数传递逻辑,避免实操困惑。

蜗牛老师,专注编程领域 1581

c和java 参数传递机制_Java方法之参数传递机制

Java方法之参数传递机制Java方法中如果声明了形参,在调用方法时就必须给这些形参指定参数值,实际传进去的这个值就叫做实参。这就涉及到Java中的参数传递机制,值传递。基本数据类型基本数据类型,值传递的体现是数值的传递。public class TransferTempTest {public static void main(String[] args) {//基本数据类型参数传递Transf...

weixin_30701169的博客 135

java-方法的参数传递机制

java-方法的参数传递机制 1.先看以下代码 /** * java-方法的参数传递机制 * * @author chenyi * Create on 2019/10/16 */ public class Exam { public static void main(String[] args) { int i = 1; String str =...

chenyi406的博客 204
上一篇: Spring Bean的生命周期
下一篇: Java 多线程基础学习
Coder-Qian
博客等级 码龄11年 63粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值