Java中参数的传递机制,究竟是值传递还是引用传递?

2023-11-09

先说结论:

Java语言中,本质上只有值传递,没有引用传递。

废话不说,咱们直接来看例子:

public class Demo {

    public static void main(String[] args) {
       int i = 10;
       testInt(i);
       System.out.println("调用testInt方法后i的值:"+i);  //10

    }

    public static void testInt(int i){
        i = 1;
        System.out.println("testInt方法内i的值:"+i);  //1
    }

}

这是传递参数为基本数据类型的例子,我们可以看到调用方法后i并没有被改变。

但咱们再来看一个传递参数为引用类型的例子:

public class Demo {

    public static void main(String[] args) {
       
       Person p = new Person();
       p.name = "小米";
       testPerson(p);
       System.out.println("调用testPerson方法后p的值:"+p);   //华为

    }

    public static void testPerson(Person p){
        p.name = "华为";
        System.out.println("testPerson方法内p的值:"+p);   //华为
    }
}

我们可以发现,我们在方法内对传递的p进行修改,竟然修改成功了,这似乎就与我们上个例子的值传递证明起冲突了。

于是就有许多人认为在Java中,传递基本数据类型是值传递,传递引用数据类型则是引用传递,但其实这是错误的。

现在我们如果在方法内添加一句代码:

public class Demo {

    public static void main(String[] args) {
       
       Person p = new Person();
       p.name = "小米";
       testPerson(p);
       System.out.println("调用testPerson方法后p的值:"+p);    //小米

    }

    public static void testPerson(Person p){
        p = new Person();
        p.name = "苹果";
        System.out.println("testPerson方法内p的值:"+p);     //苹果
    }
}

如果按照我们的理解,传递过来的p就是其本身的引用地址。逻辑应该是给p重新创建了一个对象,并对属性进行赋值,两句打印语句应该输出的都是苹果,但实际上并不是,main方法中的p并没有被改变。

这是为什么呢?

在Java语言中,传递的值其实是一份拷贝的地址(与原地址的引用相同,所以直接修改可以改变)。这样来看,我们就不难理解为什么在给p创建新的Person对象时,原先的p没有被改变了,因为我们是给拷贝过来的p创建对象。

总结:

Java的值传递,如果传递实参是基本类型,传递的则是基本类型的字面量值的拷贝;如果传递实参是引用类型,那么传递的是实参所引用的对象地址拷贝。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java中参数的传递机制,究竟是值传递还是引用传递? 的相关文章

  • 获取文件的锁

    我想在对特定文件开始 threo read 时获取文件上的锁定 以便其他应用程序无法读取已锁定的文件并希望在线程终止时释放锁定文件 您可以获得一个FileLock https docs oracle com javase 8 docs ap
  • 使用 WebDriver 单击新打开的选项卡中的链接

    有人可以在这种情况下帮助我吗 场景是 有一个网页 我仅在新选项卡中打开所有指定的链接 现在我尝试单击新打开的选项卡中的任何一个链接 在下面尝试过 但它仅单击主 第一个选项卡中的一个链接 而不是在新选项卡中 new Actions drive
  • Android 中的列表(特别是 RecyclerView 和 CardView)如何工作

    请原谅我问这个问题 但我是 Android 开发新手 尽管我正在尝试了解developer android com 网站上的基础知识 但大多数示例 即使他们说它们是为 Android Studio 构建的 尚未设置为使用 Gradle 因此
  • 当路径的点超出视野时,Android Canvas 不会绘制路径

    我在绘制路径时遇到了 Android Canvas 的一些问题 我的情况是 我有一个相对布局工作 如地图视图 不使用 google api 或类似的东西 我必须在该视图上绘制一条路径 canvas drawPath polyPath bor
  • Base36 编码字符串?

    我一直在网上查找 但找不到解决此问题的方法 在 Python Ruby 或 Java 中 如何对以下字符串进行 Base 36 编码 nOrG9Eh0uyeilM8Nnu5pTywj3935kW 5 Ruby 以 36 为基数 s unpa
  • (Java) App Engine 中的静态文件无法访问

    The 示例文档 http code google com appengine docs java gettingstarted staticfiles html表示您只需将文件放在 war 或子目录 中 并且应该可以从主机访问它们 只要它
  • 删除优先级队列的尾部元素

    如何删除优先级队列的尾部元素 我正在尝试使用优先级队列实现波束搜索 一旦优先级队列已满 我想删除最后一个元素 优先级最低的元素 Thanks 没有简单的方法 将元素从原始元素复制到新元素 最后一个除外 PriorityQueue remov
  • Logback:SizeAndTimeBasedRollingPolicy 不遵守totalSizeCap

    我正在尝试以一种方式管理我的日志记录 一旦达到总累积大小限制或达到最大历史记录限制 我最旧的存档日志文件就会被删除 当使用SizeAndTimeBasedRollingPolicy在 Logback 1 1 7 中 滚动文件追加器将继续创建
  • Android蓝牙java.io.IOException:bt套接字已关闭,读取返回:-1

    我正在尝试编写一个代码 仅连接到运行 Android 5 0 KitKat 的设备上的 目前 唯一配对的设备 无论我尝试了多少方法 我仍然会收到此错误 这是我尝试过的最后一个代码 它似乎完成了我看到人们报告为成功的所有事情 有人能指出我做错
  • 在 MongoDB 和 Apache Solr 之间同步数据的简单方法

    我最近开始使用 MongoDB 和 Apache Solr 我使用 MongoDB 作为数据存储 并且希望 Apache Solr 为我的数据创建索引 以实现应用程序中的搜索功能 经过一些研究 我发现 基本上有两种方法可以在 MongoDB
  • org/codehaus/plexus/archiver/jar/JarArchiver(不支持的major.minor版本49.0)-Maven构建错误

    下午大家 我在尝试构建项目时收到上述错误 我很确定这与使用 Java 1 6 编译的 Maven 最新更新有关 而我们尝试构建的项目是 1 4 项目 在此之前的插件工作没有问题 因此我将以下内容添加到 POM xml 文件中以尝试强制使用现
  • 虽然我的类已加载,但 Class.forName 抛出 ClassNotFoundException

    代码如下 它的作用是加载我放在主目录中的 jar 文件中的所有类 import java io File import java util jar JarFile import java util jar JarEntry import j
  • 寻找局部最小值

    下面的代码正确地找到了数组的局部最大值 但未能找到局部最小值 我已经进行了网络搜索 以找到找到最小值的最佳方法 并且根据这些搜索 我认为我正在使用下面的正确方法 但是 在几天的时间里多次检查每一行之后 下面的代码中有一些我仍然没有看到的错误
  • JAVA中遍历JSON数据

    我是 JSON 新手 我使用 HTTPUrlConnections 并在 JAVA 程序中获得一些响应 响应数据将类似于 data id 1 userId 1 name ABC modified 2014 12 04 created 201
  • Play.application() 的替代方案是什么

    我是 Play 框架的新手 我想读取conf文件夹中的一个文件 所以我用了Play application classloader getResources Data json nextElement getFile 但我知道 play P
  • 避免 Java 中的重复导入:继承导入?

    有没有办法 继承 导入 Example 常见枚举 public enum Constant ONE TWO THREE 使用此枚举的基类 public class Base protected void register Constant
  • 如何让 Emma 或 Cobertura 与 Maven 一起报告其他模块中源代码的覆盖率?

    我有一个带有 Java 代码的多模块 Maven 设置 我的单元测试在其中一个模块中测试多个模块中的代码 当然 这些模块具有相互依赖性 并且在测试执行之前根据需要编译所有相关模块中的代码 那么 如何获得整个代码库覆盖率的报告 注意 我不是问
  • 记录类名、方法名和行号的性能影响

    我正在我的 java 应用程序中实现日志记录 以便我可以调试应用程序投入生产后可能出现的潜在问题 考虑到在这种情况下 人们不会奢侈地使用 IDE 开发工具 以调试模式运行事物或单步执行完整代码 因此在每条消息中记录类名 方法名和行号将非常有
  • 使用 JFreeChart 为两个系列设置不同的 y 轴

    我正在使用 JFreeChart 使用折线图绘制两个数据系列 XYSeries 复杂的因素是 其中一个数据系列的 y 值通常远高于第二个数据系列的 y 值 假设第一个系列的 y 值约为数百万数量级 而第二个数据系列的 y 值约为数百万数量级
  • 将对象从手机共享到 Android Wear

    我创建了一个应用程序 在此应用程序中 您拥有包含 2 个字符串 姓名和年龄 和一个位图 头像 的对象 所有内容都保存到 sqlite 数据库中 现在我希望可以在我的智能手表上访问这些对象 所以我想实现的是你可以去启动 启动应用程序并向左和向

随机推荐

  • 计算机视觉项目实战-图像特征检测harris、sift、特征匹配

    欢迎来到本博客 本次博客内容将继续讲解关于OpenCV的相关知识 作者简介 目前计算机研究生在读 主要研究方向是人工智能和群智能算法方向 目前熟悉python网页爬虫 机器学习 计算机视觉 OpenCV 群智能算法 然后正在学习深度学习的相
  • android中下拉菜单的制作(详解)

    在我们的android中下拉菜单的制作有两种的方法 1 一种的方式就是通过我们的布局文件的方法制作 2 第二种方式就是通过我们的java代码的方式制作 第一种方式
  • deepin 20.2版本亮度调节问题暂时解决方案

    可在设置 gt 键盘和语言 gt 快捷键 中设置自己需要的快捷键 建议alt 1和alt 2这两个 与现有快捷键没有冲突 使用原来的快捷键会提示冲突 如果覆盖了设置可能会使原来的快捷键失效 分别添加下面的命令 降低亮度 echo your
  • Anaconda 换源与更新

    参考 Windows下Anaconda安装 换源与更新 里面很详细介绍了 conda 的更新 与 Anaconda 的更新
  • Node.js入门笔记(一)——环境问题和版本号问题

    Node js入门笔记 一 1 node js的版本管理工具 nvm 2 npm全局安装和局部安装 3 开发环境安装与生产环境安装 4 其他常用的npm语法 5 版本号里面的讲究 6 npm上传包 其实就是寒假比较无聊搭了这个自己的博客网站
  • Visual Studio+VAssistX自动添加注释

    1 增加函数头注释 右击函数名 然后依次点击 Refacto gt Document Method 这个时候函数头注释就会蹦出来 不过这个注释的格式是默认的 想修改注释格式 可以通过以下方法 点击 VAssistX gt Visual VA
  • IE下载文件时,中文文件名乱码问题

    经排查 Content Disposition中的filename进行了两次URL转码 以汉字漫为例 第一次转码 漫变为 E6 BC AB 第二次转码 E6 BC AB变为 25E6 25BC 25AB 第二次转码时 因为 是特殊字符 所以
  • word2vector学习笔记(一)

    word2vector学习笔记 一 最近研究了一下google的开源项目word2vector http code google com p word2vec 其实这玩意算是神经网络在文本挖掘的一项成功应用 本文是看了论文 Distribu
  • Spring中如何在一个Bean中注入一个内部Bean呢?

    转自 Spring中如何在一个Bean中注入一个内部Bean呢 在日常开发中 有些实体类的定义 一个类中包含了另一个类 那么在Spring Bean中 同样也有此种操作 下文将讲述使用xml配置文件的方式注入内部bean的方法 实现思路 使
  • 经典面试题 为什么要用 Docker

    经典面试题 为什么要用 Docker 解决面试题 斩获心仪的 Offer 文章目录 经典面试题 为什么要用 Docker 一 Docker是什么 二 Docker 的优势 1 更高效的利用系统资源 2 更快速的启动时间 3 一致的运行环境
  • T检验python实现

    from scipy import stats import numpy as np 方差齐性检验 方差反映了一组数据与其平均值的偏离程度 方差齐性检验用以检验两组或多组数据与其均值偏离程度是否存在差异 也是很多检验和算法的先决条件 np
  • 深度学习之基于Xception实现四种动物识别

    本次实验类似于猫狗大战 只不过将两种动物识别变为了四种动物识别 本文的重点是卷积神经网络Xception的实践 在之前的学习中 我们已经实验过其他几种比较常用的网络模型 但是Xception网络并未实践过 在弄本科毕设的时候 一个好朋友的毕
  • bukku ctf(刷题2)

    bugku ctf 抄错的字符 简单取证1 这是一张单纯的图片 计算器 GET POST 矛盾 alert 你必须让他停下 signin Easy Re 游戏过关 Easy vb 树木的小秘密 Timer 阿里CTF 抄错的字符 Crypt
  • Handler进阶之sendMessage原理探索

    Handler进阶之sendMessage 本文主要进一步的探索Handler 主要介绍下Handler是如何发送消息的 用过Handler的想必对以下几个方法都不会陌生 sendMessage Message msg 立刻发送消息 sen
  • Jdk下载和安装

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 下载JDK 二 安装JDK 三 配置环境 四 检验安装 前言 学习java第一步 写java文件都需要配置java环境 提示 以下是本篇文章正文内容 下面
  • 嵌入式-术语解释(不定时更新)

    饱和操作 饱和运算 饱和运算 就是当运算结果大于一个上限或小于一个下限时 结果就等于上限或是下限 饱和加法 a b c 当计算结果大于c可表示的最大值或者小于c可表示的最小值时 计算结果取值为这个最大值或最小值 非饱和加法 a b c 如果
  • LINQ的技术演进

    以一个简单的例子来说明 var developersUsingCSharp from d in developers where d Language C select d Name 1 提供对IEnumerable
  • 基于MATLAB编程的PCA改进GA-BP回归分析

    目录 BP神经网络的原理 BP神经网络的定义 BP神经网络的基本结构 BP神经网络的神经元 BP神经网络的激活函数 BP神经网络的传递函数 PCA的定义 遗传算法的原理及步骤 基于遗传算法改进BP神经网络的二分类 代码 效果图 结果分析 展
  • Java 学习历程

    最近论坛上看到好几个朋友都在问 如何学习 Java的问题 我已经学习了J2SE 怎么样才能转向J2EE 我看完了Thinking in Java 可以学习J2EE了么 于是就有了写这篇文章的想法 希望能帮助初学者少走一些弯路 也算是对自己几
  • Java中参数的传递机制,究竟是值传递还是引用传递?

    先说结论 Java语言中 本质上只有值传递 没有引用传递 废话不说 咱们直接来看例子 public class Demo public static void main String args int i 10 testInt i Syst