Java中参数传递:按值还是按引用?

目录

1. 按值传递 vs 按引用传递

1.1 基本数据类型:按值传递

1.2 对象引用:按引用传递

2. 拓展知识:理解 Java 的内存模型

2.1 栈内存的作用

2.2 堆内存的作用

2.3 参数传递的底层机制

3. 总结


在软件开发的世界里,Java 是一种广泛使用的编程语言,它的参数传递机制是很多新手开发者经常讨论的话题。今天,我们就来深入探讨一下 Java 中参数传递的机制,以及它背后的原理。

1. 按值传递 vs 按引用传递

在 Java 中,参数传递可以是按值传递,也可以是按引用传递。这取决于传递的参数类型。

1.1 基本数据类型:按值传递

Java 的基本数据类型包括 intfloatdoublecharbyteshortboolean。当这些类型的变量作为参数传递给方法时,实际上是传递了该变量值的拷贝。

示例代码:

public class Test {
    public static void main(String[] args) {
        int num = 10;
        changeValue(num);
        System.out.println(num); // 输出 10
    }

    public static void changeValue(int n) {
        n = 20;
    }
}

在这个例子中,changeValue 方法接收一个基本数据类型 int。方法内部对参数 n 的修改不会影响原始变量 num

1.2 对象引用:按引用传递

当你将对象引用作为参数传递给方法时,实际上是传递了对象引用的拷贝。这意味着方法接收到的是引用的拷贝,但这个拷贝指向的是同一个对象。

示例代码:

public class Test {
    public static void main(String[] args) {
        MyObject obj = new MyObject();
        obj.setValue(20);
        changeObject(obj);
        System.out.println(obj.getValue()); // 输出 30
    }

    public static void changeObject(MyObject obj) {
        obj.setValue(30);
    }
}

class MyObject {
    private int value;

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }
}

在这个例子中,changeObject 方法接收一个对象引用。方法内部对对象 obj 的修改会影响到原始对象 obj

2. 拓展知识:理解 Java 的内存模型

理解 Java 的内存模型对于深入理解参数传递机制至关重要。Java 程序运行时,内存主要分为以下几个区域:

  1. 堆内存(Heap):存储对象实例。
  2. 栈内存(Stack):存储局部变量和方法调用的上下文。
  3. 方法区(Method Area):存储类信息、常量、静态变量等。

2.1 栈内存的作用

在方法调用时,每个方法的局部变量和操作数栈都会在栈内存中创建。当方法执行时,它的局部变量和操作数栈会被推入栈中。方法执行完毕后,这些信息会从栈中弹出。

2.2 堆内存的作用

对象实例通常存储在堆内存中。当一个对象作为参数传递给方法时,实际上是传递了对象在堆内存中的引用地址。

2.3 参数传递的底层机制

  • 基本数据类型:方法调用时,基本数据类型的值会被复制到栈内存中的方法的局部变量表中。
  • 对象引用:方法调用时,对象引用的地址(即指向堆内存中对象的指针)会被复制到栈内存中的方法的局部变量表中。

3. 总结

Java 中的参数传递机制是一个复杂但有趣的话题。理解它是掌握 Java 编程的关键。基本数据类型是按值传递的,而对象引用是按引用传递的。这种机制确保了数据的安全性和灵活性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CNN模型对CIFAR-10中的图像进行分类

代码功能 这段代码展示了如何使用 Keras 和 TensorFlow 构建一个卷积神经网络(CNN)模型,用于对 CIFAR-10 数据集中的图像进行分类。主要功能包括: 加载数据:从 CIFAR-10 数据集加载训练和测试图像。 数据预处理&#…

解决:使用layui.treeTable.updateNode,更新表格数据后,done里面的事件丢失问题

1. 背景 在给树形表格添加行点击事件,并且只更新当前行数据。 treeTable.updateNode("SpeProjListId", result.LAY_DATA_INDEX, result);更新数据后,点击事件失效。 1. 给字段绑定事件: class"link_a link_style" , {…

企业级数据备份一般都是怎么做的?来唠唠嗑

小白最近去了很多企业看了一下他们的存储方案,基本上都是单硬盘数据存储,一个硬盘10TB(实际可用8TB左右)。 这些大概是大部分微小企业存储数据的办法,也是他们能想到的最好办法了吧。 截至2024年的今天,咱…

Web安全 - 安全防御工具和体系构建

文章目录 安全标准和框架1. 国内安全标准:等级保护制度(等保)2. 国际安全标准:ISO27000系列3. NIST安全框架:IDPRR方法4. COBIT与ITIL框架 防火墙防火墙的基本作用防火墙的三种主要类型防火墙的防护能力防火墙的盲区 W…

【蚂蚁HR-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…

CSS | 面试题:你知道几种移动端适配方案?

目录 一、自适应和响应式 二、为什么要做移动端适配? 三、当前流行的几种适配方案 (1) 方案一:百分比设置(不推荐) (2) 方案二:rem 动态设置 font-size px 与 rem 的单位换算 手动换算 less/scss函数 webpac…

C0004.Qt中QComboBox设置下拉列表样式后,下拉列表样式无效的解决办法

问题描述 我们平时在使用Qt Creator对控件QComboBox的样式进行设置后,在运行程序启动界面时,发现设置的样式无效,效果如下: /* 设置下拉菜单框的样式 */ QComboBox QAbstractItemView {border: 1px solid rgb(161,161,161); /* …

TransFormer 视频笔记

TransFormer BasicsAttention单头注意力 single head attentionQ: query 查寻矩阵 128*12288K key matrix 128*12288SoftMax 归一 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/19e3cf1ea28442eca60d5fc1303921f4.png)Value matrix 12288*12288 MLP Bas…

【D3.js in Action 3 精译_027】3.4 让 D3 数据适应屏幕(下)—— D3 分段比例尺的用法

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一部分 D3.js 基础知识 第一章 D3.js 简介(已完结) 1.1 何为 D3.js?1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践(上)1.3 数据可…

鸿蒙开发(NEXT/API 12)【状态查询与订阅】手机侧应用开发

注意 该接口的调用需要在开发者联盟申请设备基础信息权限与穿戴用户状态权限,穿戴用户状态权限还需获得用户授权。 实时查询穿戴设备可用空间、电量状态。订阅穿戴设备连接状态、低电量告警、用户心率告警。查询和订阅穿戴设备充电状态、佩戴状态、设备模式。 使…

基于大数据技术的颈椎病预防交流与数据分析及可视化系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏:Java精选实战项目…

【计算机网络】详解UDP协议格式特点缓冲区

一、UDP 协议端格式 16 位 UDP 长度, 表示整个数据报(UDP 首部UDP 数据)的最大长度;如果16位UDP检验和出错,报文会被直接丢弃。 1.1、检验和出错的几种常见情况 数据传输过程中的比特翻转:在数据传输过程中,由于物理介质或网络设…

python-FILIP/字符串p形编码/数字三角形

一:FILIP 题目描述 给你两个十进制正整数 a,b​,输出将这两个数翻转后的较大数。 「翻转」在本题中的定义详见「说明 / 提示」部分。输入 第一行,两个十进制正整数 a,b。输出 第一行,a 和 b 翻转后的较大数。样例输入1 734 893 样…

鸿蒙harmonyos next flutter通信之BasicMessageChannel获取app版本号

本文将通过BasicMessageChannel获取app版本号,以此来演练BasicMessageChannel用法。 建立channel flutter代码: //建立通道 BasicMessageChannel basicMessageChannel BasicMessageChannel("com.xmg.basicMessageChannel",StringCodec());…

Koa2+Vue2的简书后台管理系统

文章目录 项目实战:前(vue)后(koa)端分离1、创建简书项目2、创建数据库2.1 创建数据库2.2 连接数据库3、模型对象3.1 设计用户模块的Schema3.2 实现用户增删改查3.2.1 增加用户3.2.2 修改用户3.2.3 删除用户3.2.4 查询用户4、封装业务逻辑层5、封装CRUD6、创建Vue项目7、配…

(14)MATLAB莱斯(Rician)衰落信道仿真4

文章目录 前言一、改写莱斯分布概率密度函数的理论值二、仿真代码三、仿真结果总结 前言 本文通过将接收信号总功率设置为1,重写了莱斯衰落信道上接收信号幅度的理论PDF式。然后用MATLAB代码生成了在具有不同莱斯因子K的Ricean平坦衰落信道下接收到的信号样本&…

leetcode练习 路径总和II

给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1: 输入:root [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum 22 输出&a…

day04笔试练习

1.Fibonacci数列 题目链接:Fibonacci数列_牛客题霸_牛客网 题目思路: 定义 a b c 三个变量 使 c 一直加到比 n 大的最近的斐波那契数 此时比较 c 和 b 哪个数离得最近就好 public static void main(String[] args) {Scanner sc new Scanner(System.in…

基于facefusion的换脸

FaceFusion是一个引人注目的开源项目,它专注于利用深度学习技术实现视频或图片中的面部替换。作为下一代换脸器和增强器,FaceFusion在人脸识别和合成技术方面取得了革命性的突破,为用户提供了前所未有的视觉体验。 安装 安装基础软件 安装…

深入探究:在双链表的前面进行插入操作的顺序

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言​📝惟有主动付出,才有丰富的果…