java是值传递还是引用传递

news2024/11/24 3:00:50

文章目录

    • 1.前言
    • 2.java是值传递还是引用传递

1.前言

java是值传递;值传递是指在调用方法时将实际参数拷贝一份传递到方法中,这样在方法中如果对参数进行修改,将不会影响到实际参数;当传的是基本类型时,传的是值的拷贝,对拷贝变量的修改不影响原变量;当传的是引用类型时,传的是引用地址的拷贝,但是拷贝的地址和真实地址指向的都是同一个真实数据,因此可以修改原变量中的值。

2.java是值传递还是引用传递

Java是值传递。
当传的是基本类型时,传的是值的拷贝,对拷贝变量的修改不影响原变量;当传的是引用类型时,传的是引用地址的拷贝,但是拷贝的地址和真实地址指向的都是同一个真实数据,因此可以修改原变量中的值;当传的是String类型时,虽然拷贝的也是引用地址,指向的是同一个数据,但是String的值不能被修改,因此无法修改原变量中的值。

首先来解释一下什么是引用传递,什么是值传递。

引用传递(pass by reference)是指在调用方法时将实际参数的地址直接传递到方法中,那么在方法中对参数所进行的修改,将影响到实际参数。

值传递(pass by value)是指在调用方法时将实际参数拷贝一份传递到方法中,这样在方法中如果对参数进行修改,将不会影响到实际参数。

那在Java中到底是引用传递还是值传递呢?其实这个问题也一直是争论不断,而且官方也没给个确切答案。但是就我个人理解,Java是值转递。

我们先来看一个简单的例子:
在这里插入图片描述
在test()方法中定义了一个基本类型的变量a,然后调用change()方法试图改变这个变量,最后输出的还是原来的值。

首先我们要清楚,一个方法中的局部变量是存在栈中的,如果是基本类型的变量则直接存的是这个变量的值,如果是引用类型的变量则存的是值的地址,指向堆中具体的值。

上面的例子中,调用change()方法传递的a,其实是a变量的拷贝,不是真正的a,在change()方法中改变的是拷贝,对真正的a是没有影响的。

这么一看,Java确实是值传递,但是我们再看下面这个例子,你就会纠结了
在这里插入图片描述
看,对象里的属性被改变了,不是值传递吗,应该不会改变啊,这时候就有人总结了,当传递值是基本类型时是值传递、当传的是引用类型时是引用传递。真的是这样吗?

分析这个问题,我们需要知道变量在jvm中是怎么存储的。

首先看基本类型,这个很简单,变量在栈中直接存的是值,传到change()方法的是这个变量的拷贝,因此对拷贝的变量修改不会影响原变量的值。

接着看引用类型,变量在栈中存储的是引用地址,这个地址指向堆中具体的值,如下图:
在这里插入图片描述
当调用change()方法传入变量时,也是拷贝变量,但是这里的拷贝只是栈中的引用地址,并不会拷贝堆中的数据,因此会变成下图这样:

在这里插入图片描述
虽然变量是拷贝,但是指向的地址是同一个,因此对变量中的数据修改时,还是会影响到原来真实的变量,但是,如果我们修改的是变量在栈中的地址,则不会影响原变量,例如下面这段代码:
在这里插入图片描述
这种是修改变量在栈中的地址,则不会影响原变量。

说到这里,大家差不多懂了,但是回头看最开始的那个问题,传入String类型的变量,String是引用类型,按道理,原变量是会被改变的呀,结果怎么是不变呢?

String变量比较特殊,我们看String的源码可以知道,String的值是通过内部的char[]数组来维护的,但是这个数据定义的是final类型的,因此,String的值是不可变的。我们平时修改String的值,其实是重新new了一个String对象,例如下面这段代码:
在这里插入图片描述
这段代码里,其实a变量并没有被修改成world,只是重新new了一个String对象,这个对象的值是world,并把这个对象的引用地址赋给了a,原来的hello还是在堆中,只是这个值没有被引用,过段时间会被gc垃圾回收。

String变量传值在内存中的变化如下图:
在这里插入图片描述
在这里插入图片描述
String拷贝的是变量地址,但是它改变不了原String的值,因为String是不可变的,所以在change()方法中是重新new了一个String对象,改变的是新对象的值,原变量是没有影响的。

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

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

相关文章

探究MES系统:工业生产数字化转型的必需品

随着时代的发展,工业生产数字化转型已经成为不可避免的趋势。而MES系统作为工业生产运营管理领域中的一种重要软件系统,更是在数字化转型过程中扮演着重要的角色。 什么是MES系统 MES系统全称为制造执行系统(Manufacturing Execution Syste…

快速傅里叶变换python实现

img { margin: auto; display: block } 一、前言 我想认真写好快速傅里叶变换(Fast Fourier Transform,FFT),所以这篇文章会由浅到细,由窄到宽的讲解,但是傅里叶变换对于寻常人并不是很容易理解的,所以对于基础不牢的人…

基础知识学习---链表基础

1、本栏用来记录社招找工作过程中的内容,包括基础知识学习以及面试问题的记录等,以便于后续个人回顾学习; 暂时只有2023年3月份,第一次社招找工作的过程; 2、个人经历: 研究生期间课题是SLAM在无人机上的应…

Vue中如何进行音频与视频播放?

Vue中如何进行音频与视频播放&#xff1f; 在Vue中&#xff0c;我们可以使用HTML5的<audio>和<video>标签来实现音频和视频的播放。Vue本身并没有提供专门的音频或视频播放组件&#xff0c;但是可以使用Vue的数据绑定和生命周期钩子来控制音频和视频的播放。 音频…

【gcc, cmake, eigen, opencv,ubuntu】一.gcc介绍

文章目录 gcc介绍1.查看当前gcc 版本2.安装其他版本的gcc3.设置多个版本的优先级4.修改默认的版本5.查看cpu信息 gcc介绍 gcc介绍和makefile介绍 1.查看当前gcc 版本 gcc --version2.安装其他版本的gcc sudo apt install gcc-10 g-10这样我们电脑里包含gcc-9 和 gcc-10两个…

[玩游戏想道理]战略的感受

game&#xff1a;金铲铲之战 战略的定义可以说是非常多了&#xff0c;这里主要是就游戏中的过程谈一些实践感受和理解&#xff1b; 这里也不是谈战略的定义xxxx&#xff0c;这方面的理论包括《孙子兵法》都是强太多了&#xff0c;主要就是在游戏这个“现实模拟器”中&#xff0…

全志V3S嵌入式驱动开发(开机脚本、程序运行)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 目前为止的内容&#xff0c;大部分都是和驱动相关的。就算有部分上层代码&#xff0c;也只是为了测试驱动是否ok而编写的。事实上&#xff0c;作为…

团队管理之性能实施团队日志13

项目经过了&#xff0c;8 个业务系统和 7 个基础架构系统的测试之后&#xff0c;又完成了全链路的两个域的测试&#xff0c;终于进入了尾声。 过程中发现了 257 个问题&#xff08;只统计了 8 个业务系统&#xff09;&#xff0c;平均每个系统 32.125 个。问题 age 达到 861.77…

「微服务架构模式」编曲与编舞——让系统协同工作的不同模式

介绍 Krzysztof&#xff08;采访者&#xff09;&#xff1a;商业组织是由专家组成的&#xff0c;他们在他们最了解的领域提供产品或服务&#xff0c;以获得共同的商业成果。例如&#xff0c;营销团队努力争取新客户&#xff0c;销售团队向这些客户销售产品&#xff0c;客户关系…

用4种回归方法绘制预测结果图表:向量回归、随机森林回归、线性回归、K-最近邻回归

文章目录 表格部分数据如下运行效果如下代码解析完整代码附件 表格部分数据如下 附件里会给出全部数据链接 运行效果如下 代码解析 import pandas as pd import numpy as np import matplotlib.pyplot as plt from matplotlib.font_manager import FontPropertiesfont FontP…

FPGA实现USB3.0 UVC 相机彩条视频输出 基于FT602驱动 提供工程源码和QT上位机源码

目录 1、前言2、UVC简介3、FT602芯片解读4、我这儿的 FT601 USB3.0通信方案5、详细设计方案基于FT602的UVC模块详解 6、vivado工程详解7、上板调试验证8、福利&#xff1a;工程代码的获取 1、前言 目前USB3.0的实现方案很多&#xff0c;但就简单好用的角度而言&#xff0c;FT6…

用代码玩转迷你图:手把手教你用编程语言打造简洁易读的数据图表!

前言 迷你图&#xff08;Mini Chart&#xff09;最早起源于流程图和组织架构图中的一种简化图形&#xff0c;用于表示一个大型数据集合中的趋势和变化。随着数据可视化技术的发展&#xff0c;迷你图也被广泛应用在各种类型的数据图表中&#xff0c;例如折线图、柱形图、散点图…

【027】C++类和对象的基本概念

C类和对象的基本概念 引言一、类的封装性二、定义一个类三、设计一个类3.1、示例一&#xff1a;设计一个Person类3.1、示例二&#xff1a;设计一个Cube类 四、成员函数在类外实现五、类在其他源文件中实现总结 引言 &#x1f4a1; 作者简介&#xff1a;专注于C/C高性能程序设计…

RFID工业读头工作原理和优势

RFID工业读头由天线&#xff0c;耦合元件&#xff0c;芯片&#xff0c;可对RFID标签信息进行读取和写入&#xff0c;在工业上也常作为信息的传输、处理的载体。下面我们就一起来了解一下&#xff0c;工业读头工作原理和优势是什么。 工业读头工作原理 工业RFID读头主要是通过天…

微信小程序嵌入H5页面,最简单的兼容方式web-view

//index.wxml---------------------------------------- <web-view src"{{src}}" />//index.js---------------------------------------- Page({data: {src: "https://dz.wedoyun.cn/mobile/?v20230615",},});

1.6C++双目运算符重载

C双目运算符重载 C中的双目运算符重载指的是重载二元运算符&#xff0c;即有两个操作数的运算符&#xff0c;如加减乘除运算符“”、“-”、“*”和“/”等。 通过重载双目运算符&#xff0c;可以实现自定义类型的运算符操作。 比如可以通过重载加减运算符实现自定义类型的向…

电脑误删文件恢复怎么做?数据恢复,4招就行!

我有定期清理电脑的习惯&#xff0c;一般都会将电脑里的一些垃圾文件删除&#xff0c;但在最近一次的清理中&#xff0c;我不小心把重要的文件当作垃圾文件删除了&#xff0c;请问有什么比较好的解决方法吗&#xff1f;非常感谢&#xff01; 当下电脑的使用越来越频繁&#xff…

抖音seo源码-源代码开发搭建-开源部署(不加密)

抖音SEO矩阵系统源码开发功能模型是指在抖音平台上提高视频搜索排名的一种算法模型。该功能模型包括多个部分&#xff0c;如内容优化、用户交互、社交化推广等&#xff0c;通过对这些因素的优化和提升&#xff0c;达到提高视频搜索排名的目的。具体实现包括使用关键词、标签等优…

谷粒商城p46-配置网关路由与路径重写

软件 &#xff1a; vscode idea 服务&#xff1a; renren-fast&#xff0c;gulimall-product&#xff0c;gulimall-gateway、nacos 前提条件&#xff1a; gateway、renren-fast已经注册到nacos 注意&#xff1a; 1、renren-fast单独注入nacos依赖&#xff0c;不要注入common…

CAD绘制三维图形基础

绘制三维图形的基础操作包括&#xff1a; 1、打开3d绘图窗口&#xff0c;进入3d绘图界面 2、改变绘图视角 3、改变图形的展现形式 4、绘制基本的几何图形 5、掌握对齐等修改功能 6、掌握基础布尔操作 首先是切换工作空间&#xff0c;在界面的右下角有一个类似设置的按钮…