当前位置: 首页 > article >正文

Java的值传递与“引用传递”辨析

目录

  • Java的值传递与“引用传递”辨析
    • 1. 传递方式概述
    • 2. 值传递示例
    • 3. “引用传递”示例
    • 4. 值传递与"引用传递"的实际应用
    • 5. 总结:java只有值传递

Java的值传递与“引用传递”辨析

欢迎来到本博客,今天我们将深入研究Java中是值传递还是引用传递,这是一个经常让人困惑的话题。

1. 传递方式概述

在Java中,当你将一个变量传递给一个方法时,你实际上是在传递这个变量的值。然而,对于引用类型,这个值是对象引用的副本,而不是对象本身。

2. 值传递示例

考虑以下的值传递例子:

public class ValueExample {

    public static void main(String[] args) {
        int x = 5;
        modifyValue(x);
        System.out.println("After modifyValue: " + x);
    }

    public static void modifyValue(int value) {
        value = 10;
    }
}

在这个例子中,modifyValue 方法接收一个整数参数,并将其值修改为10。然而,当方法执行完成后,x 的值仍然是5。这是因为基本数据类型(如int)是按值传递的,传递的是变量的副本,而不是变量本身。

3. “引用传递”示例

现在,我们来看一个例子:

public class ReferenceExample {

    public static void main(String[] args) {
        StringBuilder str = new StringBuilder("Hello");
        modifyReference(str);
        System.out.println("After modifyReference: " + str);
    }

    public static void modifyReference(StringBuilder reference) {
        reference.append(" World");
    }
}

在这个例子中,modifyReference 方法接收一个StringBuilder引用,并在原始对象上进行修改。当方法执行完成后,str 的值变为Hello World。这是因为引用类型是按值传递的,传递的是引用的副本,但仍然指向同一个对象。

4. 值传递与"引用传递"的实际应用

在实际开发中,理解值传递和引用传递的概念有助于更好地处理数据和避免一些常见的误解。

public class App {

    public static void main(String[] args) {
 
        int a = 5;
        modifyValue(a);
        System.out.println("After modifyValue: " + a);

        StringBuilder str = new StringBuilder("Hello");
        modifyReference(str);
        System.out.println("After modifyReference: " + str);
    }

    private static void modifyValue(int value) {
        value = 10;
    }

    private static void modifyReference(StringBuilder reference) {
        reference.append(" World");
    }
}

在这里插入图片描述
看样子java是支持引用传递,但是其实java是值传递,我们如果下面这样处理;

public static void main(String[] args) {

        StringBuilder str = new StringBuilder("Hello");
        modifyReference(str);
        System.out.println("After modifyReference2: " + str);
    }


    // 引用传递
    private static void modifyReference(StringBuilder reference) {
        StringBuilder stringBuilder = new StringBuilder(reference);
        stringBuilder.append(" World");
        System.out.println("After modifyReference1: " + stringBuilder);
    }

在这里插入图片描述
看到内层打印hello world,而外层还是hello,所以之前的只是改变了引用类型的副本,真实还是值传递。

通过这个例子,我们清晰地展示了值传递在Java中的应用,希望这有助于你更好地理解Java中的参数传递机制。

5. 总结:java只有值传递

总结:对于形参的修改不会影响到实参就是值传递,对于形参的修改能够影响到实参就是引用传递
通过本博客,我们详细了解了Java中只有值传递,没有引用传递。希望这篇博客对您有所帮助。

感谢您的阅读,下一篇博客将继续分享有关Java开发的知识,敬请期待!


http://www.kler.cn/a/228555.html

相关文章:

  • StarRocks 3.4 发布--AI 场景新支点,Lakehouse 能力再升级
  • Linux系统的第一个进程是什么?
  • 搭建Hadoop源代码阅读环境
  • 两份PDF文档,如何比对差异,快速定位不同之处?
  • ChromeOS 132 版本更新
  • 认识 MySQL 和 Redis 的数据一致性问题
  • UE中对象创建方法示例和类的理解
  • C语言:文件操作详解
  • 深度学习本科课程 实验4 卷积神经网络
  • 银行数据仓库体系实践(18)--数据应用之信用风险建模
  • 154基于matlab的二维元胞自动机模拟森林火灾(生命游戏 )和模拟收费站交通流
  • Unity3d Cinemachine篇(完)— TargetGroup
  • 【python】OpenCV—Tracking(10.1)
  • 【leetcode题解C++】450.删除二叉搜索树中的节点 and 669.修剪二叉搜索树 and 108.将有序数组转换为二叉搜索树
  • 【数据结构】排序---C语言版
  • 力扣热门100题刷题笔记 - 10. 正则表达式匹配
  • week03day04(正则表达式2)
  • 如何配置SSH实现无公网ip远程连接访问Deepin操作系统
  • rust原生语言对比 <在rust内> 执行javascirpt与lua解释型语言的性能
  • 如何使用LNMP让网站顺利工作?
  • oracle 修改表结构语句
  • 【高质量精品】2024美赛A题22页word版成品论文+数据+多版本前三问代码及代码讲解+前四问思路模型等(后续会更新)
  • 【Java篇】——浅拷贝or深拷贝
  • 2023年的本地外卖市场,对创业者而言还是块香饽饽吗?
  • 【Golang】exec.command命令日志输出示例
  • C# 怎么判断屏幕是第几屏幕?屏幕是垂直还是水平?屏幕的分辨率?