Java到底是值传递还是引用传递【通俗易懂】

news2025/2/25 6:07:04

我相信很多刚学Java的小伙伴都很难理解Java到底是值传递还是引用传递的问题,但肯定背过这道面试题。确实,Java就是值传递,那什么原理呢?请往下看。

我们先看一段代码:分析一下这两句打印的结果分别是什么。

public class Test {
    public static void main(String[] args) {
        double percent = 10;
        tripleValue(percent);
        System.out.println("percent的值为:" + percent);
    }

    public static void tripleValue(double x){
        x = 3 * x;
        System.out.println("x的值为:" + x);
    }
}
x的值为:30.0
percent的值为:10.0

可能有小伙伴会问了,我明明将变量percent传到tripleValue方法中了,并在方法内,将值乘以了3,那x和percent的值都应该是30.0啊?

嗯,按逻辑讲确实是这样,但Java却不是这么做的,它在你传参的时候,偷偷的将percent变量拷贝了一个“副本”,也就是x,后面再用3 * x的时候,其实乘以的是副本,早就不是你传的percent变量了,等tripleValue方法结束,参数变量x就被干掉了。

那么肯定又有小伙伴问了,你基本数据类型勉强算你过关,那我传个Java对象总能破你的局了吧,我就不信传一个对象地址,你还没影响?

嗯,还真是有影响,但你还破不了我的局,请看如下代码,假如我想将员工的工资提高三倍(如果这个员工是我就好了):

public class Test {
    public static void main(String[] args) {
        Employee e = new Employee(); //创建员工对象
        e.setSalary(10.0); //设置e员工的工资为10
        tripleSalary(e);
        System.out.println("e的工资为:" + e.getSalary());
    }

    public static void tripleSalary(Employee x){
        double addSalary = x.getSalary() * 3; //为员工涨工资
        x.setSalary(addSalary);
        System.out.println("x的工资为:" + x.getSalary());
    }
}
x的工资为:30.0
e的工资为:30.0

从结果上来看,实现方法改变对象参数的状态是完全可以的。理由也很简单,方法得到的是对象引用的“副本”,原来的对象引用和这个副本都引用同一个对象,就类似于这样:

在传参的时候,依然搞了一个副本x,但x和e指向的是同一个对象地址,所以x改了,e也改。

我们再通过一个例子来让你完全理解到底是值传递还是引用传递,下面来编写一个交换两个 Employee 对象的方法:

public static void swap(Employee x, Employee y){
	Employee temp = x;
	x = y;
	y = temp;
}

如果 Java 对对象采用的是按引用调用,那么这个方法就应该能够实现交换:

Employee a = new Employee();
Employee b = new Employee();
System.out.println("a的地址值为:" + a);
System.out.println("b的地址值为:" + b);
swap(a, b);
System.out.println("交换后a的地址值为:" + a);
System.out.println("交换后b的地址值为:" + b);
a的地址值为:com.example.test.controller.Employee@5caf905d
b的地址值为:com.example.test.controller.Employee@27716f4
交换后a的地址值为:com.example.test.controller.Employee@5caf905d
交换后b的地址值为:com.example.test.controller.Employee@27716f4

从结果上看出,a和b并没有实现交换,其实原因很简单,在传递参数的过程中,还是拷贝了两个副本,a的副本是x,b的副本是y,方法中交换的也是x和y交换,压根没a和b什么事,所以可以得出结论,Java是值传递。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/982217.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

对象存储 OSS

大家好 , 我是苏麟 , 今天聊聊OSS . 这里使用阿里云的OSS对象存储. 首先大家得有一个阿里云账号 , 注册大家都会 这里不多介绍 . 阿里云官网 : 阿里云登录页 (aliyun.com) 首页产品目录下存储集合里对象存储OSS 进入对象存储OSS页面 点击管理控制台(新用户应该有免费试用期的)…

【数学建模竞赛】预测类赛题常用算法解析

解析常见的预测类算法 灰色预测模型 灰色预测模型是一种利用少量的、不完全的信息,建立数学模型并进行预测的方法。该方法通过对系统行为特征的发展变化规律进行估计预测,同时也可以对行为特征的异常情况发生的时刻进行估计计算,并研究特定…

Python商业数据存取

🐳 我正在和鲸社区参加“商业数据分析训练营活动” https://www.heywhale.com/home/competition/6487de6649463ee38dbaf58b ,以下是我的学习笔记: 学习主题:Python商业数据存取 日期:2023.9.6 关键概念/知识点&…

IMX6ULL移植篇-uboot源码目录表

一. uboot 源码分析前提 由于 uboot 会使用到一些经过编译才会生成的文件,因此,我们在分析 uboot的时候,需要先编译一下 uboot 源码工程。 这里所用的开发板是 nand-flash 版本。 本文学习续上一篇文章,如下: IMX6U…

电商物流解决方案公司Globavend申请纳斯达克IPO上市

来源:猛兽财经 作者:猛兽财经 猛兽财经获悉,电商物流解决方案公司Globavend近期已向美国证券交易委员会(SEC)提交招股书,申请在纳斯达克IPO上市,股票代码为(GVH)&#x…

chatglm2-6b在P40上做LORA微调 | 京东云技术团队

背景: 目前,大模型的技术应用已经遍地开花。最快的应用方式无非是利用自有垂直领域的数据进行模型微调。chatglm2-6b在国内开源的大模型上,效果比较突出。本文章分享的内容是用chatglm2-6b模型在集团EA的P40机器上进行垂直领域的LORA微调。 …

智慧铁路:机车整备场数字孪生

机车整备场是铁路运输系统中的重要组成部分,它承担着机车的维修、保养和整备工作,对保障铁路运输的运维和安全起着至关重要的作用。 随着铁路运输的发展、机车技术的不断进步,以及数字化转型的不断推进,数字孪生技术在机车整备场…

LeetCode刷题笔记【27】:贪心算法专题-5(无重叠区间、划分字母区间、合并区间)

文章目录 前置知识435. 无重叠区间题目描述参考<452. 用最少数量的箭引爆气球>, 间接求解直接求"重叠区间数量" 763.划分字母区间题目描述贪心 - 建立"最后一个当前字母"数组优化marker创建的过程 56. 合并区间题目描述解题思路代码① 如果有重合就合…

【业务功能篇99】微服务-springcloud-springboot-电商订单模块-生成订单服务-锁定库存

八、生成订单 一个是需要生成订单信息一个是需要生成订单项信息。具体的核心代码为 /*** 创建订单的方法* param vo* return*/private OrderCreateTO createOrder(OrderSubmitVO vo) {OrderCreateTO createTO new OrderCreateTO();// 创建订单OrderEntity orderEntity build…

echarts饼图label自定义样式

生成的options {"tooltip": {"trigger": "item","axisPointer": {"type": "shadow"},"backgroundColor": "rgba(9, 24, 48, 0.5)","borderColor": "rgba(255,255,255,0.4)&q…

Python Qt学习(十)一个简易的POP3邮件客户端

公司把126这类的邮箱网站都封了&#xff0c;正好现在无事&#xff0c;加之&#xff0c;算是一个对这俩周学习Qt的一个总结吧。遂写了这么一个简易的通过POP3协议接收126邮件的客户端。 源代码&#xff1a; # -*- coding: utf-8 -*-# Form implementation generated from read…

OpenCV图像处理——矩形(Rect)类的常用操作

1.Rect类 创建类 Rect类成员变量x、y、width、height&#xff0c;分别为左上角点的坐标和矩形的宽和高。 创建一个Rect对象Rect,并在图像上画该矩形框。 cv::Rect rect(100, 50, 500, 500);cv::Mat cv_src cv::imread("11.JPG");cv::rectangle(cv_src, rect, cv:…

每一座屎山代码背后,都藏着一堆熟读代码规范的研发

&#x1f449;导读 韩寒在《他的国》中写道&#xff1a;“我们懂很多道理&#xff0c;却依然过不好这一生”&#xff0c;人们虽然知道很多道理&#xff0c;但并不一定能将这些道理应用到实际生活中。这种现象在生活中很常见&#xff0c;我们听了很多的成功学的道理&#xff0c;…

接入 NVIDIA A100、吞吐量提高 10 倍!Milvus GPU 版本使用指南

Milvus 2.3 正式支持 NVIDIA A100&#xff01; 作为为数不多的支持 GPU 的向量数据库产品&#xff0c;Milvus 2.3 在吞吐量和低延迟方面都带来了显著的变化&#xff0c;尤其是与此前的 CPU 版本相比&#xff0c;不仅吞吐量提高了 10 倍&#xff0c;还能将延迟控制在极低的水准。…

ChatGLM2-6B 部署

引言 这是ChatGLM2-6B 部署的阅读笔记&#xff0c;主要介绍了ChatGLM2-6B模型的部署和一些原理的简单解释。 ChatGLM-6B 它是单卡开源的对话模型。 充分的中英双语预训练 较低的部署门槛 FP16半精度下&#xff0c;需要至少13G的显存进行推理&#xff0c;甚至可以进一步降低…

罕见病 对称性脂肪瘤(MSL) 马德龙病

如果你体内脂肪瘤分布大致如下 而且个数不断增多 这篇文章适合你 症状 脂肪瘤个数一直增加 而且很对称 比如: 左手臂一个 右手臂一个 别名 多发性对称性脂肪增多症 Multiple symmetric lipomatosis (MSL) 多发性对称性脂肪瘤&#xff08;MSL&#xff09; 脂肪瘤 马德龙病(…

大场景的倾斜摄影三维模型OBJ格式轻量化处理处理关键处理技术分析

大场景的倾斜摄影三维模型OBJ格式轻量化处理处理关键处理技术分析 大场景的倾斜摄影三维模型是指通过航空或地面摄影获取的大范围、高分辨率的地理环境数据。为了在虚拟环境中加载和渲染这些模型&#xff0c;需要对其进行OBJ格式的轻量化处理。本文将分析大场景的倾斜摄影三维模…

SSRF漏洞实战

文章目录 SSRF概述SSRF原理SSRF 危害PHP复现SSRF漏洞检测端口扫描内网Web应用指纹识别攻击内网应用读取本地文件 Weblogic SSRF--Getshell复现SSRF攻击Redis原理漏洞检测端口扫描复现翻车&#xff0c;请看官方复现教程注入HTTP头&#xff0c;利用Redis反弹shell SSRF防御过滤输…

软路由的负载均衡设置:优化网络性能和带宽利用率

在现代网络环境中&#xff0c;提升网络性能和最大化带宽利用率至关重要。通过合理配置软路由IP的负载均衡设置&#xff0c;可以有效地实现这一目标&#xff0c;并提高整体稳定性与效果。本文将详细介绍如何进行软路由IP的负载均衡设置&#xff0c;从而优化网络表现、增加带宽利…

软件架构设计(六) 软件架构风格-MDA(模型驱动架构)

概念 模型驱动架构MDA, 全称叫做Model Driven Architecture。 Model:表示客观事物的抽象表示Architecture:表示构成系统的部件,连接件及其约束的规约Model Driven: 使用模型完成软件的分析,设计,构建,部署和维护等 开发活动MDA起源于分离系统规约和平台实现的思想。之前…