Java面试基础问题之(三)—— Java的值传递

Java面试题(基础篇),15个经典面试问题及回答思路 金三银四到了,送上一个小福利!利![外链图片转存中…(img-qvSxwqCw-1711755580359)][外链图片转存中…(img-CYtxVCp6-1711755580360)][外链图片转存中…(img-k2wnA5eT-1711755580360)] 阅读详情

Java中的数据类型可以归为两大类:基本类型和引用类型,前者不用多说,boolean,byte,char short,int,long,float,double 8种基本类型,后者即为所有的类,当然,数组也可以归为类。

基本类型不用讨论,就是值传递(值拷贝),方法中对值的改变不影响原参数的值,下面重点探讨引用类型的参数传递方式。

        先看一个例子:

测试类:

测试类的两个方法:

changeReference ():

changeProperty ():

测试代码及结果:

 

可以“神奇”地发现,changeReference ():竟然没有改变p1的值。

之所以用神奇这个词,因为长期受Java“一切皆对象”的洗脑,想当然认为Java方法的参数传递相当于“引用传递”(C++的知识),即方法中所有对引用的操作都会影响对象本身。而很明显,现在结果告诉我们不是那么回事。

分析之前这里插一句话,实际运用中基本只会用到changeProperty()方式:

谁没事会去传一个对象的引用,然后在方法中对引用本身(而不是对其所指的对象)进行操作(也只有重新赋值这一个操作)呢,就算有此需求,也会将此变量设计为类的属性field,在方法中改变(如setter和getter),不会这么麻烦地传进去再操作。

不管怎么说,找这么多的借口,现在事实摆在眼前:p1没有改变。

原因先摆上:Java中,引用类型的传递方式也是值传递。

即在调用:

时,是先对p1进行了一份拷贝,同样指向Tom,在changeReference () 中是对这份拷贝进行了重定向,如下图 :   

而p1并没有任何改变,这一点可以通过打印p1前后的hashCode(直接打印p1调用默认的toString()即可)得到验证:前后是一样的,而在changeReference()内部打印的p(p = new Person("Jerry");之前和之后都输出一下p),会发现前后是不一样的。(PS:由于此处是后来的编辑,所以打印代码就不实验了)

 

再看一例:数组引用的参数传递

测试类:

测试类的两个方法:

changeReference(Person[] p):

changeElement(Person[] p):

测试及结果:

有了上一例的基础,很好理解p1的值为什么没有改变:传入changeReference(Person[] p)方法的仅仅是p1值的一份拷贝,方法体中对该拷贝数组引用本身的改变当然不会影响到原数组。

不过,鉴于数组的特殊性,还是要深究一下原理,先看 p1结构:

如上图,对象数组中实际上存的是对象引用,即对象数组实际上是对象引用数组,那么数组名(此处为p1)可以称为“引用数组的引用”,此时:

就很好理解了,如下图

其中红色是原始的p1,蓝色是changeReference(Person[] p)进行的改变,可以看到,改变之后的p2内容没人任何变化。

而changeElement(Person[] p):

p[0]和p[1]就是指向原对象Person("a")和Person("b")的引用,现在对其新的赋值,所以上面的代码就类似于上一例子中:

即将对象引用本身改变了,不同的是,这里的对象引用没有使用值拷贝,而且外面“套了”一层数组,这样通过数组首地址指针p,再次访问到对象引用p[0],p[1]时,就不是原来的p[0],p[1](Person("a")和Person("b"))了,如下图示:   

其中红色是原始的p2,蓝色是changeElement(Person[] p)进行的改变,可以看到,改变之后的p2的地址没有变化,但数组元素所引用的对象变化了。

故,综上可以总结出一句话:

“Java只有值传递”

 

 

 

 

SPI模式下的SD卡读写,为什么你的数据总出错?详解时序与状态机避坑指南 本文深入探讨SPI模式下SD卡读写数据出错的根本原因,提供时序优化与状态机设计的实战指南。针对时钟周期计数、状态机跳转和忙检测等核心问题,详解命令时序细节、状态机同步策略及高级避坑技巧,帮助开发者提升SD卡在SPI模式下的稳定性和性能。 阅读详情

相关推荐

基于JAVA的GB28181实现之SIP服务核心组件解析

本文深入解析了基于JAVA的GB28181标准中SIP服务的核心组件实现,包括协议栈选择、消息处理引擎、事务管理器等关键技术点。通过实战案例分享海康威视、大华设备的特殊处理技巧,并提供性能优化和常见问题排查指南,帮助开发者高效构建稳定的视频监控系统。

weixin_30892037的博客 264

Java的值传递和引用传递,你真的搞清楚了吗?

点击上方 "程序员小乐"关注,星标或置顶一起成长后台回复“大礼包”有惊喜礼包!关注订阅号「程序员小乐」,收看更多精彩内容每日英文Do a plain and neat ...

程序员小乐 1087

STM32鱼塘水质监测系统设计与实现

物联网技术在农业领域的应用正逐步深入,其中传感器网络作为关键基础设施,通过实时数据采集与传输实现环境监测。基于STM32微控制器的嵌入式系统因其高性能和低功耗特性,成为物联网终端设备的理想选择。该系统通过DS18B20水温传感器、PH传感器和浊度传感器组成的多参数检测网络,配合4G通信模块实现水质数据的远程监控。在农业物联网场景中,这种解决方案不仅大幅降低了传统人工检测的成本,更能通过实时预警有效预防养殖损失。本文介绍的鱼塘水质监测系统正是这一技术的典型应用,展示了如何通过STM32和常见传感器构建高性价比

weixin_42173218的博客 620

这一次,彻底解决Java的值传递和引用传递

本文旨在用最通俗的语言讲述最枯燥的基本知识 学过Java基础的人都知道:值传递和引用传递是初次接触Java时的一个难点,有时候记得了语法却记不得怎么实际运用,有时候会的了运用却解释不出原理,而且坊间讨论的话题又是充满争议:有的论坛帖子说Java只有值传递,有的博客说两者皆有;这让人有点摸不着头脑,下面我们就这个话题做一些探讨,对书籍、对论坛博客的说法,做一次考证,以得出信得过的答案。 其...

weixin_34174322的博客 1万+

HFSS螺旋线圈的优化设计与高效仿真实践

本文详细介绍了HFSS螺旋线圈的优化设计与高效仿真实践,涵盖核心参数设置、参数化建模、仿真加速技巧及结果分析。通过HFSS软件实现螺旋线圈的高效仿真,特别适用于无线充电和RFID系统设计,提升设计效率与性能验证准确性。

weixin_30235225的博客 443

手把手教你给STM32F103移植LVGL触摸驱动(基于野火开发板,附完整代码)

本文详细介绍了如何在野火STM32F103开发板上移植LVGL触摸驱动,提供从环境准备到代码实现的完整指南。通过XPT2046触摸芯片的底层驱动集成和LVGL输入设备接口配置,开发者可以快速实现触摸功能,并解决常见问题如触摸无响应、坐标偏移等。

weixin_30856725的博客 1021

Java面试题:值传递和引用传递(清晰易懂)

文章目录前言一、值传递和引用传递是什么?二、如何理解Java中只有值传递没有引用传递总结 前言 首先,不要纠结于 Pass By Value 和 Pass By Reference 的字面上的意义,否则很容易陷入所谓的“一切传引用其实本质上是传值”这种并不能解决问题无意义论战中。 更何况,要想知道Java到底是传值还是传引用,起码你要先知道传值和传引用的准确含义吧?可是如果你已经知道了这两个名字的准确含义,那么你自己就能判断Java到底是传值还是传引用。 这就好像用大学的名词来解释高中的题目,对于初学者根

m0_43405679的博客 1419

【YOLO26保姆级零踩坑教程】环境搭建+五大任务快速入门,一行代码实现检测/分割/姿态/OBB/分类(Win+Linux全适配)

YOLO26环境搭建与实战指南:零踩坑全适配 本文是YOLO26全栈技术专栏的入门篇,提供Windows/Linux双系统的纯实战环境搭建指南,主打零踩坑、全适配。YOLO26基于Ultralytics框架优化,无需编译源码或手动下载权重,原生支持多任务推理。 环境配置关键点: 必须安装Ultralytics 8.4.0及以上版本 支持CPU/GPU环境,推荐Python 3.8-3.11 提供清华源配置解决下载慢问题 安装步骤: CPU版:一键安装Ultralytics和OpenCV GPU版:匹配CUD

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 774

Java中的值传递与引用传递 含面试题

值传递是一种数据传递方式,它是将数据的副本传递给方法或函数。当我们将一个变量传递给一个方法时,方法接收到的是原始数据的副本,而不是原始数据本身。这意味着在方法内部对参数的修改不会影响到原始数据。int x = 10;value = 20;在这个示例中,我们定义了一个名为的方法,它接受一个整数参数value,然后将value的值修改为20。但是,在main方法中,我们可以看到,x的值仍然是10。这是因为在方法内部,对value的修改不会影响到x的值。这就是值传递的特点。

赵KK的博客 848

100天精通Python(基础篇)——第4天:数据类型全解析_从基础到转换

数据类型全解析_从基础到转换

努力让自己发光,对的人才能迎着光而来 11万+

AI技术在电商中的实际应用

人工智能、电商、推荐系统、个性化、机器学习、深度学习 1. 背景介绍 电子商务行业近年来发展迅速,用户数量不断增长,商品种类日益丰富。然而,随着市场竞争的加剧,电商平台面临着如何提升用户体验、提高转化率、挖掘潜在商机等一系列挑战。人工智能(AI)技术作为一种新兴技术,凭借其强大的数

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 1740

Java面试题21——参数传递中的值传递

参数传递中的值传递 参数传递中的值传递 当一个对象被当作参数传递到一个方法后,在此方法内可以改变这个对象的属性,那么这里到底是值传递还是引用传递? **答:是值传递。**Java 语言的参数传递只有值传递。当一个实例对象作为参数被传递到方法中时,参数的值就是该对象的引用的一个副本。指向同一个对象,对象的内容可以在被调用的方法内改变,但对象的引用(不是引用的副本) 是永远不会改变的。 ​ ...

huiyanfreeflying的博客 381

【ESP32摄像头开发实例】-视频流接入Home Assistant

在这个项目中,我们将使用ESP32-CAM板构建一个IP监控摄像头。ESP32摄像头将托管一个视频流媒体网络服务器,您可以使用网络中的任何设备进行访问。

视觉与物联智能 789

当面试官问我————Java是值传递还是引用传递?

面试官:你好,你能说出下面个程序的执行结果吗? public class Test { public static void main(String[] args) { String name = "Scott"; int age = 5; User user = new User(); user.setName(name); user.setAge(age); S...

Morty的技术乐园 7813

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

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

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Java基础——值传递

/ 输出 [Original, Modified]System.out.println(obj.value);// 输出 100(非200!// 输出 10(未改变)// √ 修改原始对象(副本指向同一对象)d = new Data(200);// x 修改副本指向(不影响原始引用)// ❌ 修改副本引用。// ✅ 修改原始集合。对象引用 → 传递引用的副本(非对象本身)

chunbai0的博客 1554

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Java 是值传递还是引用传递

最近整理面试题,整理到值传递、引用传递,到网上搜了一圈,争议很大。带着一脸蒙圈,线上线下查了好多资料。最终有所收获,所以分享给大家,希望能对你有所帮助。 首先说下我的感受,这个题目出的很好,但是在 Java 中这个题目是有问题的(在下面我会解释)。并且,有很多结论是 Java 中只有 值传递。我认为这样说不够严谨。当然如果针对 Java 语言本身来讲,Java 中只有 值传递,没有...

XiaoJL博客 5万+

Camera2Demo

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

Java 值传递与引用传递

Java参数传递机制深度解析:只有值传递,没有引用传递 本文系统阐述了Java参数传递的核心机制,明确指出Java中只有值传递,不存在引用传递。对于基本类型,传递的是值的副本;对于引用类型,传递的是对象引用地址的副本。文章通过内存模型分析、20+代码实例和与其他语言的对比,揭示了以下关键点: 值传递的本质是传递副本,形参修改不影响实参 引用类型看似"引用传递"的表现,实则是通过地址副本修改共享对象 Java选择单一值传递机制是为了简化设计、确保安全 开发中需注意不可变对象、引用重新赋值等

果酱 の 博客 1569

面试常考基础,Java传递方式--值传递

是通过这份拷贝里的地址找到原对象,把 id 改成 2。我过去的理解,值传递是不可能能够改变实参的,在Java中,我又发现好像可以改变耶,我就以为是不是我记错了,Java中的传递方式也是有两种,除了值传递,还有引用传递,我还以为我记错了,我特意上网查了一下,确实没有,我也特意弄懂了这一部分。现在说一下前言中说我在C++关于传递的错误理解我一直以为,C++中的引用传递,传递的参数与实参指向同一个对象(这是对的),因此传递过去实际是实参的地址,后面我才发现我理解错了,实际形参就直接理解为就是实参的一个别名。

sdgfafg_25的博客 1032

Java面试基础

文章目录1. Java概述1.1 何为编程1.1.1 什么是Java1.1.2 jdk1.5之后的三大版本1.1.3 JVM、JRE和JDK的关系1.1.4 什么是跨平台性?原理是什么1.1.5 Java语言有哪些特点1.1.6 什么是字节码?采用字节码的最大好处是什么1.1.7 什么是Java程序的主类?应用程序和小程序的主类有何不同?1.1.8 Java应用程序与小程序之间有那些差别?1.1.9 Java和C++的区别1.1.10 Oracle JDK 和 OpenJDK 的对比(感觉有点偏)2.基础语

ggs_27的博客 7423

详细解析面试题:Java的值传递

先从一道面试题说起: 以下程序输出结果是什么: public class Point { private int x; private int y; public Point(int x, int y) { this.x = x; this.y = y; } public void setLocation(int x, int y) { this.x = x; this.y = y; ...

qianlia的博客 1409

Java 基础面试题

首先了解一下什么是不可变对象,不可变对象就是一经创建后,其对象的内部状态不能被修改,啥意思呢?也就是说不可变对象需要遵守下面几条原则不可变对象的内部属性都是 final 的不可变对象的内部属性都是 private 的不可变对象不能提供任何可以修改内部状态的方法、setter 方法也不行不可变对象不能被继承和扩展与其说问 String 为什么是不可变的,不如说如何把 String 设计成不可变的。

在技术的广袤天地里,本博客如精准罗盘。剖析前沿科技,深掘代码奥秘,以精炼笔触,带您穿越复杂技术迷宫,速达知识彼岸。 2645

Java基础面试题02:简述什么是值传递和引用传递?

引用传递(pass by reference)是指直接将实际参数的“地址”传递给函数。函数内的参数变动,会直接影响到实际参数的值,因为函数操作的是原始的“引用”而不是副本。然而!许多编程语言(比如 Java 和 Go)其实并不是严格意义上的引用传递。它们传递的依然是“值”,只不过这个“值”可能是对象的引用(也就是内存地址的副本)。这点是很多人容易误解的地方。值传递:传递的是参数的值,函数内修改对实际参数无影响。引用传递:传递的是参数的引用,函数内修改直接影响实际参数。

程序员江小北 1387

面试官:兄弟,说说Java到底是值传递还是引用传递

二哥,好久没更新面试官系列的文章了啊,真的是把我等着急了,所以特意过来催催。我最近一段时间在找工作,能从二哥的文章中学到一点就多一点信心啊! 说句实在话,离读者 trust you 发给我这段信息已经过去 1 周时间了。不是我怠慢,确实是可更新的内容实在是太多了。这不,又有两个读者不约而同地要求我更新一下 Java 到底是值传递还是引用传递方面的文章——其实这个问题我之前是写过的,但现在看起来...

沉默王二 6669

Java基础面试题: 面向对象(克隆、值传递、Java包)

收集大量Java经典面试题目,内容涵盖了包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 等知识点。适合准备Java面试的读者参考和复习。

m0_46013789的博客 1372

java 中String到底是值传递还是引用传递的问题

1.String中的坑   最近看到一道关于string的面试题,差点让我以为string是值传递,就是下面这个例子,体验下: 1 2 3 4 5 6 7 8 9 10 11 12 public class demo{ public static void main(string[] args) { demo d =new de...

zyz的博客 7628

JAVA面试大全〖三〗 JAVA基础

JAVA面试基础〖三〗一. 寄语二. Array和列表ArrayList的区别三. 请你解释一下值传递和引用传递?四. 请你解释为什么会出现4.0-3.6=0.40000001这种现象?五. 请你说说Lamda表达式的优缺点。六. 你知道java8的新特性吗,请简单介绍一下七. 请你解释为什么重写equals还要重写hashcode?制作不易,转载请标注~~ 一. 寄语 大三了,也不能浪了,总...

kingtok的博客 296
上一篇: Java面试基础问题之(四)—— 类的初始化顺序
下一篇: Java面试基础问题之(六)—— 不能被继承:final,private,static和构造方法
ProLayman
博客等级 码龄10年 105粉丝 192原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值