通过底层原理理解Java是值传递还是引用传递?

本文学习目标或者巩固的知识点

  • 参数传递方式
    • 值传递
    • 引用传递
    • 指针传递
  • 彻底理解Java的值传递和引用传递
    • 从底层的角度分析
    • 值传递会发生复制行为

Java的参数传递例子

快手的一面面试曾经问到过此类题目,所以记下此篇加深印象。
问:求下面main方法中的输出结果,如果知晓结果则可跳过此篇

public static void main(String[] args) {int num = 1;值传递_基本类型(num);System.out.printf("值传递_基本类型方法结束后=>num=%d \n", num);Person person = new Person();person.name = "张三";引用传递_引用类型(person);System.out.printf("引用传递_引用类型方法结束后=>person.name=%s \n", person.name);
}public static void 值传递_基本类型(int num){num = 2;
}
public static void 引用传递_引用类型(Person person){person.name = "李四";
}public static class Person{public String name;
}

输出

值传递_基本类型方法结束后=>num=1 
引用传递_引用类型方法结束后=>person.name=李四 

什么是值传递?

百度百科: 值传递是指在调用函数时将 实际参数 复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。

Java中基本数据类型:整型(4种)、浮点型(2种)、字符型(1种)、布尔型(1种)。

在赋值操作符(=)的作用下,将变量的值从调用者的作用域传递到被调用的作用域。

对于基本数据类型,复制的是值本身,而不是变量的内存地址。因此,如果一个变量在调用过程中被修改,那么在返回调用者的作用域时,其值仍然是复制时的值。

public static void main(String[] args) {int num = 1;Integer number = 1;char ch = '1';Character character = '1';值传递_基本类型(num,number,ch,character);System.out.printf("值传递_基本类型方法结束后=>num=%d, number=%d, ch=%c, character=%c \n", num, number, ch, character);
}
public static void 值传递_基本类型(int num, Integer number, char ch, Character character){num = 2;number = 2;ch = '2';character = '2';System.out.printf("值传递_基本类型方法内=>num=%d, number=%d, ch=%c, character=%c \n", num, number, ch, character);
}
值传递_基本类型方法内=>num=2, number=2, ch=2, character=2 
值传递_基本类型方法结束后=>num=1, number=1, ch=1, character=1 

什么是引用传递?

百度百科:所谓 引用传递 是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

在Java中与引用传递相类似的有引用类型的传递(如数组、Object类),在赋值操作符(=)的作用下,将变量的引用指向的对象从调用者的作用域传递到被调用的作用域

对于引用类型,复制的是对象的引用,而不是对象本身。因此,如果一个对象在调用过程中被修改,那么在返回调用者的作用域时,所引用的对象仍然是调用时的对象,但其内容可能会发生变化。比如:如果一个对象包含其他对象作为成员,那么在值传递过程中,只有对象的引用会被复制,而成员对象则不会被复制。这意味着在调用过程中,如果修改了对象内部的成员对象,那么在返回调用者的作用域时,该成员对象可能已经不再是最新的。

值传递:引用数据类型

public static void main(String[] args) {int[] arr = new int[1];char[] chs = new char[1];List<Integer> ls = new ArrayList<>();Person person = new Person();arr[0] = 1;chs[0] = '1';ls.add(1);person.name = "张三";System.out.printf("引用传递_引用类型方法执行前=> " +"\n arr[0]=%d, chs[0]=%c,ls.get(0)=%d, person.name=%s \n", arr[0], chs[0], ls.get(0), person.name);引用传递_引用类型(arr,chs,ls,person);System.out.printf("引用传递_引用类型方法结束后=> " +"\n arr[0]=%d, chs[0]=%c,ls.get(0)=%d, person.name=%s \n", arr[0], chs[0], ls.get(0), person.name);
}
public static void 引用传递_引用类型(int[] arr, char[] chs, List<Integer> ls, Person personCopy){arr[0] = 2;chs[0] = '2';ls.set(0,2);personCopy.name = "李四";System.out.printf("引用传递_引用类型方法中=> " +"\n arr[0]=%d, chs[0]=%c,ls.get(0)=%d, person.name=%s \n", arr[0], chs[0], ls.get(0), personCopy.name);
}
public static class Person{public String name;
}

在这里插入图片描述

引用传递_引用类型方法执行前=> arr[0]=1, chs[0]=1,ls.get(0)=1, person.name=张三 
引用传递_引用类型方法中=> arr[0]=2, chs[0]=2,ls.get(0)=2, person.name=李四 
引用传递_引用类型方法结束后=> arr[0]=2, chs[0]=2,ls.get(0)=2, person.name=李四 

通过底层原理理解

堆栈角度解释,Java是值传递。在Java中,当我们将一个变量从调用者的作用域传递到被调用的作用域时,传递的是变量的值(即其值,基本类型叫值,对象叫引用),而不是变量的内存地址。

值传递(基本数据类型传递)图解

对于基本数据类型,Java会进行栈上分配内存,传递的只是一份克隆数据,所以互不影响。

在这里插入图片描述

引用类型传递图解

对于引用数据类型,大部分情况下Java会进行堆上分配内存,栈上的person只是一个引用。person和personCopy是两个引用,但是都指向了同一个地址Person@60215eee,所以对这两个引用的对象内部进行修改导致的影响是一样的。

在这里插入图片描述

检验下你是否真的理解?

public static void main(String[] args) {Person person = new Person();person.name = "张三";System.out.printf("引用传递_引用类型方法执行前=> person.name=%s \n", person.name);引用传递_引用类型(person);System.out.printf("引用传递_引用类型方法结束后=> person.name=%s \n", person.name);
}
public static void 引用传递_引用类型(Person person){person = new Person();person.name = "李四";
}
public static class Person{public String name;
}

上面的代码【引用传递_引用类型方法结束后=>person.name=】输出什么?

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

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

相关文章

深度学习500问——Chapter01:数学基础

文章目录 前言 1.1 向量和矩阵 1.1.1 标量、向量、矩阵、张量之间的联系 1.1.2 张量与矩阵的区别 1.1.3 矩阵和向量相乘结果 1.1.4 向量和矩阵的范数归纳 1.1.5 如何判断一个矩阵为正定 1.2 导数和偏导数 1.2.1 导数偏导计算 1.2.2 导数和偏导数有什么区别 1.3 特征值和特征向量…

矩阵的导数运算(理解分子布局、分母布局)

矩阵的导数运算(理解分子布局、分母布局) 1、分子布局和分母布局 请思考这样一个问题&#xff0c;一个维度为m的向量y对一个标量x的求导&#xff0c;那么结果也是一个m维的向量&#xff0c;那么这个结果向量是行向量&#xff0c;还是列向量呢&#xff1f; 答案是&#xff1a…

Java学习笔记------继承

继承 Java中提供了一个关键字extends&#xff0c;用这个关键字&#xff0c;我们可以让一个类和另一个类建立继承关系 如图&#xff0c;Student和Teacher类中除了study&#xff08;&#xff09;和teacher&#xff08;&#xff09;两个成员函数不同&#xff0c;其他重复了&…

森歌深化体育营销战略,揭晓2024奥运新代言人,携手共创影响力奇迹

2024年&#xff0c;奥运龙年的春节将将过去&#xff0c;各大高端品牌便纷纷开始激烈博弈。森歌有备而来&#xff01;布局早&#xff0c;积累深&#xff0c;以其深入骨髓的体育情怀和独具匠心的品牌策略&#xff0c;成为厨电行业的佼佼者。2月27日-2月28日&#xff0c;森歌将在杭…

c++: 用c++语言对车辆进行建模

一 原理 1.1 阿克曼转向模型 转向半径:后轴中心点到原点O的距离 已知道转向半径,可以反求转向角。或者知道转向角,可以求出转向半径。 四个顶点的转向半径。 还要定义这两个参数 1.2 车辆运动的建模 运动写在大的while循环里。 绘制车辆的思路;(1)清

C++之std::tuple(二) : 揭秘底层实现原理

相关系列文章 C之std::tuple(二) : 揭秘底层实现原理 C三剑客之std::any(一) : 使用 C之std::tuple(一) : 使用精讲(全) C三剑客之std::variant(一) : 使用 C三剑客之std::variant(二)&#xff1a;深入剖析 深入理解可变参数(va_list、std::initializer_list和可变参数模版) st…

《论文阅读》利用提取的情感原因提高共情对话生成的内容相关性 CCL 2022

《论文阅读》利用提取的情感原因提高共情对话生成的内容相关性 前言简介模型架构情绪识别情绪原因提取实验结果示例总结前言 亲身阅读感受分享,细节画图解释,再也不用担心看不懂论文啦~ 无抄袭,无复制,纯手工敲击键盘~ 今天为大家带来的是《Using Extracted Emotion Caus…

module ‘json‘ has no attribute ‘dumps‘

如果在使用Python的json模块时遇到AttributeError: module json has no attribute dumps错误&#xff0c;通常是因为在Python环境中json模块不支持dumps方法。这种情况可能是因为Python的json模块被重命名或修改过导致的。 解决方法可以尝试以下几种&#xff1a; 1.检查Pytho…

从docx提取文本的Python实战代码

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

2.23 Qt day4 事件机制+定时器事件+键盘事件+鼠标事件

思维导图&#xff1a; 做一个闹钟&#xff0c;在行编辑器里输入定闹钟的时间&#xff0c;时间到了就语音播报文本里的内容&#xff0c;播报五次 widget.h&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QDebug>//输出类 #include<…

使用matlab对探空站IGRAv2数据进行提取

目录 1.IGRA的下载 2.以CHM00050527-data.txt数据为例&#xff1a; 3.使用matlab进行数据提取&#xff1a; 4.mat文件的构成如下图&#xff1a; 5. Matlab 获取代码可关注微信公众号WZZHHH&#xff0c;或者咸鱼关注&#xff1a;WZZHHH123 6.部分代码展示&#xff1a; 1.I…

用什么软件制作电子杂志

想要制作高大上的电子杂志&#xff1f;别再烦恼啦&#xff01;今天给大家推荐一款超级实用的软件&#xff0c;让你轻松制作出专业水准的电子杂志&#xff01; 这款软件功能强大&#xff0c;操作简单&#xff0c;适合所有对设计感兴趣的小伙伴们。无论是新手还是专业设计师&…

神经网络系列---感知机(Neuron)

文章目录 感知机(Neuron)感知机(Neuron)的决策函数可以表示为&#xff1a;感知机(Neuron)的学习算法主要包括以下步骤&#xff1a;感知机可以实现逻辑运算中的AND、OR、NOT和异或(XOR)运算。 感知机(Neuron) 感知机(Neuron)是一种简单而有效的二分类算法&#xff0c;用于将输入…

Cenos7搭建gitLib服务器(全网最详细)

vm安装Cenos7可参考以下链接 VM安装Cenos7(全网超详细保姆教程)_vm centos7安装教程-CSDN博客 一.安装并配置必要的依赖关系 1.1安装依赖包 安装curl、policycoreutils-python、openssh-server依赖包 yum install -y curl policycoreutils-python openssh-server 在这个…

【嵌入式实践】【芝麻】【目录】从0到1给电动车添加指纹锁

0. 前言 该项目是基于stm32F103和指纹模块做了一个通过指纹锁控制电动车的小工具。支持添加指纹、删除指纹&#xff0c;电动车进入P档等待时计时&#xff0c;计时超过5min则自动锁车&#xff0c;计时过程中按刹车可中断P档状态&#xff0c;同时中断锁车计时。改项目我称之为“芝…

Zookeeper客户端命令、JAVA API、监听原理、写数据原理以及案例

1. Zookeeper节点信息 指定服务端&#xff0c;启动客户端命令&#xff1a; bin/zkCli.sh -server 服务端主机名:端口号 1&#xff09;ls / 查看根节点下面的子节点 ls -s / 查看根节点下面的子节点以及根节点详细信息 其中&#xff0c;cZxid是创建节点的事务id&#xff0c…

【Java程序设计】【C00302】基于Springboot的校园失物招领管理系统(有论文)

基于Springboot的校园失物招领管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的校园失物招领网站&#xff0c;本系统有管理员以及用户二种角色权限&#xff1b; 系统整体功能有&#xff1a;操作日志管理、…

[晓理紫]每日论文分享(有中文摘要,源码或项目地址)--大模型、扩散模型

专属领域论文订阅 VX 关注{晓理紫}&#xff0c;每日更新论文&#xff0c;如感兴趣&#xff0c;请转发给有需要的同学&#xff0c;谢谢支持 如果你感觉对你有所帮助&#xff0c;请关注我&#xff0c;每日准时为你推送最新论文。 分类: 大语言模型LLM视觉模型VLM扩散模型视觉语言…

5分钟轻松帮你EasyRecovery恢复女朋友照片

相信有不少男性电脑玩家都会将女朋友的照片存放在电脑硬盘之内&#xff0c;作为珍贵的收藏和回忆。但是在某些时候&#xff0c;如果我们错误地删除了这些照片&#xff0c;或者由于系统问题导致其中的照片丢失&#xff0c;那么我们怎么找回女朋友的照片&#xff1f;这个问题就足…

【统计分析数学模型】聚类分析: 系统聚类法

【统计分析数学模型】聚类分析&#xff1a; 系统聚类法 一、聚类分析1. 基本原理2. 距离的度量&#xff08;1&#xff09;变量的测量尺度&#xff08;2&#xff09;距离&#xff08;3&#xff09;R语言计算距离 三、聚类方法1. 系统聚类法2. K均值法 三、示例1. Q型聚类&#x…