http://guhanjie.iteye.com/blog/1683637

一分钟理解 AP(Affinity Propagation) 亲和⼒传播算法 这篇博客发出来后,我用 Rust 复现代码出现问题。为此,我对对照了 sklearn 的相关代码,反复比较了两天,发现一处 bug,把 += 误写成了 =,导致数据量大的时候完全无法聚类。这个debug过程让我仔细梳理的 AP 算法的计算过程,今天我对这篇博客做了大规模修改,以便能原样展现原论文思想。 阅读详情

今天,我在一本面试书上看到了关于java的一个参数传递的问题:

写道
java中对象作为参数传递给一个方法,到底是值传递,还是引用传递?

 我毫无疑问的回答:“引用传递!”,并且还觉得自己对java的这一特性很是熟悉!

结果发现,我错了!

答案是:

值传递!Java中只有按值传递,没有按引用传递!

 

回家后我就迫不及待地查询了这个问题,觉得自己对java这么基础的问题都搞错实在太丢人!

 

综合网上的描述,我大概了解了是怎么回事,现在整理如下,如有不对之处望大神提出!

 

先来看一个作为程序员都熟悉的值传递的例子:

 

Java代码  收藏代码
  1. ... ...  
  2. //定义了一个改变参数值的函数  
  3. public static void changeValue(int x) {  
  4. x = x *2;  
  5. }  
  6. ... ...  
  7. //调用该函数  
  8. int num = 5;  
  9. System.out.println(num);  
  10. changeValue(num);  
  11. System.out.println(num);  
  12. ... ...  

 

答案显而易见,调用函数changeValue()前后num的值都没有改变。

 

由此做一个引子,我用图表描绘一个值传递的过程:

 

num作为参数传递给changeValue()方法时,是将内存空间中num所指向的那个存储单元中存放的值,即"5",传送给了changeValue()方法中的x变量,而这个x变量也在内存空间中分配了一个存储单元,这个时候,就把num的值5传送给了这个存储单元中。此后,在changeValue()方法中对x的一切操作都是针对x所指向的这个存储单元,与num所指向的那个存储单元没有关系了!

自然,在函数调用之后,num所指向的存储单元的值还是没有发生变化,这就是所谓的“值传递”!值传递的精髓是:传递的是存储单元中的内容,而非地址或者引用!

 

接下来,就来看java中的对象参数是怎么传递的:

同样,先给出一段代码:

Java代码  收藏代码
  1. ... ...  
  2. class person {  
  3. public static String name = "Jack";  
  4. ... ...  
  5. }  
  6. ... ...  
  7. //定义一个改变对象属性的方法  
  8. public static void changeName(Person p) {  
  9. p.name = "Rose";  
  10. }  
  11. ... ...  
  12. public static void main(String[] args) {  
  13. //定义一个Person对象,person是这个对象的引用  
  14. Person person = new Person();  
  15. //先显示这个对象的name属性  
  16. System.out.println(person.name);  
  17. //调用changeName(Person p)方法  
  18. changeName(person);  
  19. //再显示这个对象的name属性,看是否发生了变化  
  20. System.out.println(person.name);  
  21. }  

 

 答案应该大家都心知肚明:

第一次显示:“Jack”

第二次显示:“Rose”

 

方法用了一个对象参数,该对象内部的内容就可以改变,我之前一直认为应该是该对象复制了一个引用副本给调用函数的参数,使得该方法可以对这个对象进行操作,其实是错了!

http://www.cnblogs.com/clara/archive/2011/09/17/2179493.html 写道
Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本。指向同一个对象,对象的内容可以在被调用的方法中改变,但对象的引用(不是引用的副本)是永远不会改变的。 

 

为什么这里是“值传递”,而不是“引用传递”?

我还是用图表描绘比较能解释清楚:

 

 

主函数中new 了一个对象Person,实际分配了两个对象:新创建的Person类的实体对象,和指向该对象的引用变量person。

【注意:在java中,新创建的实体对象在堆内存中开辟空间,而引用变量在栈内存中开辟空间】

正如如上图所示,左侧是堆空间,用来分配内存给新创建的实体对象,红色框是新建的Person类的实体对象,000012是该实体对象的起始地址;而右侧是栈空间,用来给引用变量和一些临时变量分配内存,新实体对象的引用person就在其中,可以看到它的存储单元的内容是000012,记录的正是新建Person类实体对象的起始地址,也就是说它指向该实体对象。

这时候,好戏上台了:

调用了changeName()方法,person作为对象参数传入该方法,但是大家特别注意,它传入的是什么!!!person引用变量将自己的存储单元的内容传给了changeName()方法的p变量!也就是将实体对象的地址传给了p变量,从此,在changeName()方法中对p的一切操作都是针对p所指向的这个存储单元,与person引用变量所指向的那个存储单元再没有关系了!

回顾一下上面的一个值传递的例子,值传递,就是将存储单元中的内容传给调用函数中的那个参数,这里是不是异曲同工,是所谓“值传递”,而非“引用传递”!!!

 

那为什么对象内部能够发生变化呢?

那是因为:p所指向的那个存储单元中的内容是实体对象的地址,使得p也指向了该实体对象,所以才能改变对象内部的属性!

这也是我们大多数人会误以为是“引用传递”的终极原因!!!

双目相机标定理论与编程实现 双目相机标定是计算机视觉中的重要任务,通过确定双目相机的内参和外参,可以实现立体视觉的深度感知和三维重建。通过使用OpenCV库提供的函数,我们可以方便地进行双目相机的标定工作。双目相机标定是计算机视觉中的重要任务,用于确定双目相机的内参和外参,以实现立体视觉的深度感知和三维重建。通过上述代码,我们可以获得左右相机的内参矩阵、畸变系数、旋转矩阵和平移矩阵等参数,从而完成双目相机的标定过程。使用双目相机采集一系列左右相机的图像,确保标定板在不同位置和角度下都能被双目相机拍摄到。函数来检测标定板的角点。 阅读详情

相关推荐

Abaqus小白必看:用Micromechanics Plugin轻松搞定RVE周期性边界条件(附避坑指南)

本文为Abaqus初学者提供了使用官方Micromechanics Plugin插件高效实现复合材料代表性体积单元分析的完整指南。文章详细讲解了从插件安装、模型准备、周期性边界条件自动设置到结果验证的全流程,并重点分享了处理复杂模型和避免常见错误的实用技巧,帮助用户大幅提升RVE分析效率与准确性。

weixin_28363123的博客 796

Java基础——参数传参(基本类型,引用类型传参)

java中基本数据类型和引用数据类型作为参数传递时的原理和过程,并解释了值传递与引用传递在Java中的区别,并涉及部分java的内存模型

yexiann的博客 8883

从机械到数字:EC11旋转编码器与ESP32的PWM控制艺术

本文详细解析了EC11旋转编码器与ESP32的PWM控制技术,探讨了如何将机械旋转动作转换为精确的数字信号控制。通过硬件连接、信号处理和软件优化等实践技巧,开发者可以构建高效的人机交互系统,适用于智能照明、电机控制等多种应用场景。

android的专栏 782

java中的参数传递(值传递和引用传递详解)

java中的参数传递只有值传递,对于基本数据类型传递的是值的副本,引用数据类型传递的是引用的副本。

Diligent的博客 2715

【笔记6】SP3485自动收发电路设计分析

则TXD路为1,MOS管导通,2/3引脚为0,芯片实际上事与愿违的进入了接收模式。但是,由于我们采用单根双绞线与上位机通信,在数据发出去前数据线上没有任何信号传输,所以AB处于高阻态,进而受到R1下拉与R2上拉的影响,差分信号为1,所以输出1;此外,RXD内路也被上拉,485总线B端上拉,A端下拉。此时TXD由于没有数据传输,所以一直处于1的状态,因而MOS管导通,2/3引脚为0,芯片处于正常接收状态。总而言之就是,RE#与 DE只能有一个是1,1代表微控制器向外发送,0代表微控制器接收。

Haytham233的博客 3138

团结引擎+OpenHarmony 2实战篇:从零构建鸿蒙应用开发环境

本文详细介绍了如何从零开始构建鸿蒙应用开发环境,重点讲解了团结引擎与OpenHarmony 2的实战配置步骤。内容包括DevEco Studio安装、OpenHarmony SDK配置、团结引擎集成及项目创建等关键环节,帮助开发者快速搭建高效的开发环境,提升鸿蒙应用开发效率。

weixin_29294395的博客 263

Java 引用传递

在 Java 中,变量可以存储基本类型的值或对象的引用。当一个对象的引用被传递给一个方法或函数时,实际上传递的是该对象的引用而不是对象本身。这种传递方式被称为引用传递。在引用传递中,方法或函数可以修改传递进来的对象,这个修改可以在函数外部得到反映。这与值传递不同,值传递只是将对象的值进行拷贝,不会对原对象进行修改。引用传递是 Java 中一个重要的概念,它可以使得函数或方法可以修改传入的对象。在 Java 中,引用传递的实现方式是通过将对象的引用作为参数传递给方法或函数来实现的。

hj1993的博客 5766

ABAP Reduced Message Types:用精简 IDoc + Change Pointer,把主数据分发做得又快又省

本文介绍了SAP系统集成中主数据分发的精简优化方法。通过创建"精简消息类型"(Reduced Message Types),可以在不改标准IDoc类型的前提下,只发送接收系统真正需要的数据。文章详细解析了主数据变更链路的完整流程,包括变更文档、变更指针和IDoc生成机制,并重点说明了如何在BD53事务中创建精简消息类型、选择保留字段、激活变更指针等实操步骤。此外,还介绍了通过BD59过滤对象和BD64分发模型实现更精确的数据分发,以及变更指针的激活验证、IDoc生成作业和定期清理等运维要

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 132

Java 中引用类型的参数传递

当引用类型作为参数传递给方法时,方法接收的是引用的副本,指向同一个对象。在方法内部修改对象的属性,会影响到方法外部的对象。在方法内部重新赋值引用,不会影响方法外部的引用。理解 Java 中引用类型的参数传递机制,有助于编写更加高效和健壮的代码。记住,虽然 Java 是按值传递,但对于引用类型,这个值是引用本身。掌握这一点,可以帮助大家更好地理解代码的行为,避免常见的陷阱。

muxiuyulin871的博客 819

高通 vs MTK vs 海思:三大平台 ISP 架构横向对比与实战差异分析

随着移动影像能力成为智能终端差异化竞争的核心维度,ISP(Image Signal Processor)架构日益重要。高通、MTK、海思三大 SoC 厂商在 ISP 设计上各具特色,不仅在图像处理链路、模块集成度、算法加速路径等方面存在显著差异,同时也决定了终端厂商在成像质量、调试复杂度与扩展能力上的实际表现。本文将基于真实平台项目经验,横向对比三大主流平台的 ISP 架构关键指标,系统分析其在实际开发过程中的能力边界、工程成本与调优空间,帮助工程师更精准地进行平台选型与优化策略制定。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 3926

电子元器件-接口电路篇:RS-232、RS485/422、I2C、SPI、USB、网口

以上规定说明了RS-232C 标准对逻辑电平的定义。对于数据(信息码):逻辑“1”的传输的电平为-3V~-15V,逻辑“0”传输的电平为+3V~+15V;对于控制信号;接通状态(ON)即信号有效的电平为+3V~+15V,断开状态(OFF)即信号无效的电平为-3V~-15V,也就是当传输电平的绝对值大于3V 时,电路可以有效地检查出来;

qq_60226558的博客 887

Java中的参数传递

很多程序设计语言(比如 C++、 Pascal )提供了两种参数传递的方式,不过,在 Java 中只有值传递。那我们常听的Java中的引用传递是什么?传递的是一个拷贝,即副本。也就是说,对于一个参数传递,存在两个地址指向同一个内存空间。

m0_74267125的博客 2674

基于STM32的太阳能充电宝设计_资料编号31

系统硬件包括主控 STM32F103C8T6、0.96 OLED 显示屏、蜂鸣器、电源自锁开关、温度传感器 DS18B20、继电器、5 V DC 升压模块 、TB4056、18650锂电池、9 V太阳能板、稳压降压 5 V三极管。电源供应:锂电池为系统供电,9 伏太阳能板经 5 伏降压稳压三极管降压为 5 伏后传送到 TP4056,TP4056 为锂电池供电,因锂电池电压 3.7 伏,通过 5 伏 DC 升压模块升压到 5 伏为整个系统提供 5 伏电压。

嵌入式阿齐Archie 1万+

Java 字符串 引用传参

Java 字符串的引用传参 在 Java 编程中,字符串是一种非常重要的对象。作为程序中常用的数据类型之一,字符串不仅承载着信息,还在多个方面影响着程序的性能和稳定性。本文将深入探讨 Java 字符串的引用传参机制,帮助大家更好地理解 Java 字符串在方法传递中的行为,以及何时会影响到原始字符串。 一、Java 字符串简...

weixin_42299728的博客 298

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

《Java核心密卷36讲》3-4讲学习笔记

目录 谈谈fnal、fnally、 fnalize有什么不同? 强引用、软引用、弱引用、幻象引用有什么区别? 谈谈fnal、fnally、 fnalize有什么不同? fnal可以用来修饰类、方法、变量,分别有不同的意义,fnal修饰的class代表不可以继承扩展,fnal的变量是不可以修改的,而fnal的方法也是不可以重写的(override)。 fnally则是Java保证重点代码一定要被执行的一种机制。我们可以使用try-fnally或者try-catch-fnally来进行类似关闭J.

qq_45839708的博客 341

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

JAVA的方法传参值传递与引用传递

值传递与引用传递

xjxwyf的博客 1202

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Java中的值传递和引用传递

Java中的值传递和引用传递

z972065491的博客 1307

Java中函数参数传递是【值传递】还是【引用传递】?

引用变量,是存在栈中的,其指向的对象,是存在堆中的,引用变量的值其实就是指向的对象在堆中的具体的地址。指针传递(pass by pointer),即将实参的地址传递给形参,后续操作形参,就是直接操作内存空间,进而也会影响实参。函数调用的时候,根据实参和形参之间的关系、如何影响等,可以将参数的传递方式分为值传递、指针传递、引用传递【不同编程语言规定有不同传递方式】。在Java中,方法参数的传递方式总是按值传递,这意味着不管一个变量是基本数据类型还是引用数据类型,传递的都是变量的一个副本。,而不是变量的副本。

massive_jiang的博客 1537

Java引用数据类型的传参机制

B类中编写一个方法test200,可以接受一个Person(age,sal)对象,在方法中修改该对象属 性,看看原来的对象是否变化。B类中编写一个方法test100,可以接受一个数组,在方法中修改数组,看看原来的数组是 否变化。基本数据类型,传递的是值,形参的任何改变不影响实参;

qq_45789558的博客 439

Java只有值传递,没有引用传递!

结论:Java中的参数传递,只有值传递,没有引用传递!

Yu_Mariam的博客 1610

Java中只有按值传递,没有按引用传递!

今天,我在一本面试书上看到了关于java的一个参数传递的问题: 写道 java中对象作为参数传递给一个方法,到底是值传递,还是引用传递?  我毫无疑问的回答:“引用传递!”,并且还觉得自己对java的这一特性很是熟悉! 结果发现,我错了! 答案是: 值传递!Java中只有按值传递,没有按引用传递!   回家后我就迫不及待地查询了这个问题,觉得自己对java这么基础的问题都搞错实在太...

guhanjie的专栏 609

关于java的参数传递(值传递、引用传递和传值、传引用等)

所谓参数传递就是用函数调用所给出的实参(实际参数)向函数定义所给出的形参(形式参数)设置初始值的过程。基本的有三种参数分别为: (1)传值:  (2)传址(即是传指针) (3)传引用 以上这些都是根据参数的类型来分别的,是指传递的东西是什么,而不是指传递过程,但是在传递过程中也有和它们比较混淆的名词,这就是是值传递和引用传递,总体上函数调用可以分为两类,是根据传递时的过程来

ZytheMoon的博客 4146

java引用及方法传参

对象传参时,传基本数据类型就是传入值的拷贝;传入对象这种参数时,可以理解为也是一种值的拷贝,只不过这个值是对象的地址,所以对象传参传的是地址的拷贝,实际指向的是同一个对象。

随记 364

Java 基础之参数传递

Java 基础之参数传递

Go_ahead_forever的博客 1172

java中值传递和引用传递

对于基本数据类型,传递的是变量的副本。因此,方法内部对参数的修改不会影响外部变量。对于对象,传递的是对象引用的副本。尽管传递的仍然是值,但由于这个值是引用,因此方法内部对对象的修改会影响外部对象。

Flying_Fish_roe的博客 4058

java实现引用参数传递

Java实现引用参数传递 作为一名刚入行的小白,你可能会对Java中的参数传递方式感到困惑。在Java中,参数传递主要有两种方式:值传递和引用传递。值传递是将参数的值复制给方法,而引用传递则是将参数的引用复制给方法。但是,Java中实际上只有值传递,没有真正的引用传递。不过,我们可以通过一些技巧来模拟引用传递的效果。 流程...

weixin_30883241的博客 360
上一篇: 文件过滤<FilenameFilter>
下一篇: JAVA链表Map的用法
FengChueng
博客等级 码龄11年 1粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值