java中调用方法传值问题详解

2023-10-30

背景

最近,我在用java写代码过程中遇到了这么个情况:通过调用 方法 来修改 值,有时候能成功,有时候却失败,让我百思不得其解。于是,这篇博文诞生了,与大家一起分享一下我的使用心得。

基础知识

想要搞清楚这个问题之前,我们得清楚的明白: 在 java 中有哪些数据类型。

  • java中的数据类型,分为两类:基本数据类型引用数据类型

  • 基本数据类型:

基本数据类型
整数类型 int、long、short、byte
浮点类型 float、double
字符类型 char
布尔类型 boolean
  数据类型 大小/字节 可表示数据范围 默认值
1 byte(字节型) 1 -128~127 0
2 short(短整型) 2 -32768~32767 0
3 int(整型) 4 -2147483648~2147483647 0
4 long(长整型) 8 -9223372036854775808~9223372036854775807 0
5 float(单精度) 4 -3.4E38~3.4E38 0.0
6 double(双精度) 8 -1.7E308~1.7E308 0.0
7 char(字符) 2 0~255 '\u0000'
8 boolean(布尔) - true或false false

 

  • 引用数据类型:非基本数据类型的都是引用数据类型,你把基本数据类型记熟就好了。例如:String类型

除了弄清楚数据类型外,你还得大致了解他们在内存中是如何存储的。

  • 基本数据类型的存储:在方法中定义的非全局基本数据类型变量的具体内容是存储在中的

  • 引用数据类型的存储:只要是引用数据类型变量,其具体内容都是存放在中的,而中存放的是其具体内容所在内存的地址

代码演练

有了上面的基础知识储备,我们来讲三个代码示例,帮助大家理解 在 java 中 参数是如何传递的。

第一种:传 基本数据类型

package test;

/**
 * ClassName: changeData <br/>
 * Description: 调用方法 传递的是基本数据类型 能改变其值吗?
 * date: 2021/5/6 16:16<br/>
 *
 * @author yiqi<br />
 * @since JDK 1.8
 */
public class changeData {

    public static void main(String[] args) {
        int a = 10;
        System.out.println("改变前的a ->" + a);
        changeA(a);
        System.out.println("改变后的a ->" + a);
    }

    private static void changeA(int temp) {
        temp = 12;
    }
}

结果证明:调用方法,传入 基本数据类型 变量的值 ,原始值没变

原因分析:因为 基本数据类型 作为方法参数 传递给方法 是 一种值拷贝,你改变的是他的兄弟,不是他自身。

图解分析:

第二种:传 引入数据类型

package test;

/**
 * ClassName: changeData <br/>
 * Description: 调用方法 传递的是引用数据类型 能改变其值吗?
 * date: 2021/5/6 16:16<br/>
 *
 * @author yiqi<br />
 * @since JDK 1.8
 */
public class changeData {

    public static void main(String[] args) {
        person p = new person();
        System.out.println("改变前的age ->" + p.age);
        changeA(p);
        System.out.println("改变后的age ->" + p.age);
    }

    private static void changeA(person temp) {
        temp.age = 12;
    }
}

class person{
    int age = 10;
}

结果证明:调用方法,传入 引用数据类型 变量的值 ,原始值变了

原因分析:因为 引用数据类型 作为方法参数 传递给方法 是 一种地址(引用)拷贝,你改变了这个地址对应的值,就是改变了他自身。

图解分析:

第三种:传 String 引用类型

package test;

/**
 * ClassName: changeData <br/>
 * Description: 调用方法 传递的是引用数据类型 能改变其值吗?
 * date: 2021/5/6 16:16<br/>
 *
 * @author yiqi<br />
 * @since JDK 1.8
 */
public class changeData {

    public static void main(String[] args) {
        String a = "yiqi";
        System.out.println("改变之前a的值 ->" + a);
        changeA(a);
        System.out.println("改变之后a的值 ->" + a);
    }

    private static void changeA(String temp) {
        //这两种方法效果都是一样的,都是改变不了原型值,
        //区别就在于: 
        //temp = "yiqi is changed"; 这句话 是对常量的一个操作,内容值存储在类的常量池,在编译期间完成内存分配
        //temp = new String("yiqi is changed"); 这句话 才是真的创建了一个新的 String 对象,在运行期间完成
//        temp = "yiqi is changed";
        temp = new String("yiqi is changed");
        System.out.println("temp的值 ->" + temp);
    }
}

结果证明:调用方法,传入 String 引用数据类型(包装类) 变量的值 ,原始值没变

原因分析:你可以仔细看看代码,我们在 changeA() 方法里有创建了一个 String 对象给了 temp;相当于改变的是temp的地址值,而改变的并非是其地址对应的值

图解分析:

总结:这里得提醒大家的是第二种和第三种传参和对参数的处理是有区别的。在方法中一个引用指向了一个新的对象(引用),相当于改变了其地址值,只在方法中生效,出了方法,原来的引用内容是怎么样还是怎么样。

与String类似的还有 Integer 类等

 

有偿提问

如果大家觉得这篇文章帮助你了,可以支持一下。

有偿提问

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

java中调用方法传值问题详解 的相关文章

  • 在 Spark 中写入 JSON 时保留具有空值的键

    我正在尝试使用 Spark 编写 JSON 文件 有一些键有null作为价值 这些在中显示得很好DataSet 但是当我写入文件时 密钥会丢失 我如何确保它们被保留 写入文件的代码 ddp coalesce 20 write mode ov
  • Java 8 可选

    我想检查特定对象大小是否大于 0 如果它大于 0 那么我想创建一个可选对象 如果不是 那么我想返回一个可选的空对象 这是java代码的长版本 if fooA size gt 0 return Optional of new Foo else
  • Maven项目中的HDF5

    我正在尝试将 hdf hdf5lib H5 导入到 NetBeans 中的 Maven 项目中 它有这个作为导入行 import hdf hdf5lib H5 正如这里所建议的 https support hdfgroup org prod
  • 调试器不会停止在 Intellij IDEA 中的源代码处

    我有一个相当奇怪的问题 无法使用 Intellij IDEA 解决 我正在解析电子邮件文件org apache james mime4j包裹 但我的邮件文件格式不兼容Date 标头 因此 我从 mime4j 源创建了模块 并从磁盘中删除了
  • 在 JList 中写一些东西

    嘿 我还有另一个问题 我创建JList在我的主窗口中 现在我想向其中添加一些内容 我这样做 private void jButton2ActionPerformed java awt event ActionEvent evt Dodaj
  • 如何在 Java 中复制对象?

    考虑下面的代码 DummyBean dum new DummyBean dum setDummy foo System out println dum getDummy prints foo DummyBean dumtwo dum Sys
  • 如何在 Android 中签署 AAR Artifacts?

    我目前正在开发一个 AAR android 库 我想用我自己的密钥对已发布的工件进行签名 以便我可以确定我是否发布了具有相同名称和功能的假 aar 注意事项1 我希望能够以编程方式检查我的库的真实性 即使是一个伪造的库 只是伪造了我的 aa
  • Android Fabric Crashlytics 崩溃,初始化时未找到资源

    我从 google play 控制台收到了这份报告 看起来 Fabric 在启动时崩溃了 因为某些用户出现了资源未找到的异常 java lang RuntimeException at android app ActivityThread
  • 如何在 SpringBoot v3.0.0 中使用嵌入式 MongoDB?

    我正在尝试连接嵌入式 mongodb 并使用 MongoDbSpringIntegrationTest 对其进行测试 问题是相同的代码在 2 7 7 中适用于 spring boot 但在 3 0 0 中不适用于 spring boot 问
  • 如何使用Gson将JSONArray转换为List?

    在我的 Android 项目中 我试图将收到的 JSONArray 转换为列表 在 的帮助下这个答案 https stackoverflow com questions 8371274 how to parse json array in
  • 如何防止我的 servlet 被其他网站调用

    好的 我有一个像这样的简单的 servlet public class SimpleServlet extends HttpServlet public void doPost HttpServletRequest req HttpServ
  • Android 的@hide 注解到底有什么作用?

    Android中很多内部API都被标记出来了 hide What exactly这是吗 另一个答案 https stackoverflow com questions 17035271 what does hide mean in the
  • 覆盖乔达一周的第一天?

    是否有可能覆盖乔达弱的第一天sunday 因为 Joda 使用Monday作为一周的第一天 如果有办法的话 谁能解释一下 我在 SOF 中提到了以下主题 乔达时间 一周的第一天 https stackoverflow com questio
  • 基于磁盘的 HashMap [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 Java 是否有 或者是否有可用的库 允许我拥有基于磁盘的 HashMap 它不需要是原子的或任何东西
  • String.intern() 线程安全吗

    我想在Java中使用 String intern 来节省内存 对具有相同内容的字符串使用内部池 我从不同的线程调用这个方法 这是个问题吗 对你的问题的简短回答是肯定的 它是线程安全的 但是 您可能需要重新考虑使用此工具来减少内存消耗 原因是
  • 致命异常:OkHttp 调度程序

    我在 Android 应用程序中使用 OkHttp 库向天气 API 发出 Web 请求 我已经实现了我的代码 但在执行请求时遇到了致命异常 我也已经在我的清单中添加了互联网权限 MainActivity java private Curr
  • java.lang.IllegalStateException:FragmentManager 已被销毁

    活动中onResume我称之为 volley request 的方法 它获取项目列表 然后将它们加载到此活动内的 ListFragment 中 当我第一次进入活动时 一切正常 但当我重新进入活动时 ListFragment 为空 并且控制台
  • 不鼓励在Web应用程序中使用线程吗?

    我们与同事就在 Java 的 Web 应用程序中使用线程进行了激烈的讨论 他们的观点是 不建议在 Java Web 应用程序中使用线程 因为它们不受容器管理 一般来说 我对此表示同意 因为线程可能会干扰容器 但是 如果它不是 Java EE
  • 如何将字符串解析为map

    有一个像A B C D E F这样的字符串 如何将其解析为map 我会使用拆分 String text A B C D E F Map
  • Spring - 使用存储过程时使用 simplejdbccall 进行批量更新

    我正在使用 spring jdbc 模板 使用存储过程创建记录 public Long create City obj SimpleJdbcCall jdbcCall new SimpleJdbcCall getJdbcTemplate g

随机推荐

  • Java合并两个有序的整数数组

    题目描述 给出两个有序的整数数组 A和B 请将数组B 合并到数组 A中 变成一个有序的数组 注意 可以假设A 数组有足够的空间存放 B数组的元素 A和 B中初始的元素数目分别为 m和Nn public class Solution publ
  • 泛微oa主表赋值明细表_Java学习第89天--OA系统

    学习主题 OA系统 学习目标 1 掌握web开发项目实战 熟练使用web开发基础技术 对应作业 1 报销管理 添加报销单 业务层 1 在报销主表和明细表中都有一个字段叫expid 这个字段在数据库中是利用序列获取的 但是在业务层中 我们要控
  • 将postgresql数据库内容导出至sqlite数据库

    上周为应对去外地投标演示网站demo时可能没网的问题 经理让我把远程服务器的postgresql数据库上的数据导出至access或sqlite数据库中 几经波折 终于完成 现将过程记录如下 demo所用S2SH框架 经查询了解hiberna
  • (python 毕业设计)基于“协同过滤”算法的订餐推荐小程序

    B站小程序演示视频 https www bilibili com video BV1Lg411D7mP spm id from 333 337 search card all click 总体架构 核心功能 美食推荐 根据学号查询该学生的消
  • 在linux中DATAX和DATAX-WEB安装指引

    DATAX介绍 DataX 是一个异构数据源离线同步工具 致力于实现包括关系型数据库 MySQL Oracle等 HDFS Hive ODPS HBase FTP等各种异构数据源之间稳定高效的数据同步功能 DATAX WEB介绍 DataX
  • 论文总结——Cluster Canonical Correlation Analysis

    原文链接 http xueshu baidu com s wd paperuri ba0044ede74ce3a08eb2f83cc970284b filter sc long sign sc ks para q 3DCluster Can
  • Mac OS 修改ROOT账户密码

    方法一 首先 启动机器 启动时按住Apple和S键 以单用户模式 single user mode 进入系统 输入 mount uw 然后回车 输入 passwd 短用户名 如果你知道的话 如果你不知道短用户名 可以输入 passwd ro
  • MySQL 复合查询 && 内外连接

    目录 基本查询回顾 多表查询 自连接 group by可以带多个 子查询 在from子句中使用子查询 合并查询 表的内连和外连 内连接 外连接 左外连接 右外连接 关于自连接和内连接 chatgpt 基本查询回顾 查询工资高于 500 或岗
  • 线性代数——分块矩阵计算行列式的方法

    https blog csdn net wwxy1995 article details 104477088
  • 406什么错误ajax,ajax406错误

    如上 ajax请求时一直返回error 但是后台已经正确返回 网上给出的解决办法是spring3 的 但我的是sppring 4 的 应该不适用 我也没试 思索一下 406 not acceptable 直译过来是不接受 不接受什么呢 后台
  • 下载nrm,不能切换镜像源

    需要管理一下npm下载源的 打算用nrm管理的 结果可以成功下载下来nrm 但是不能nrm ls 查看所有源 看了看报错 search了几下 以为是报错的那个路径文件有问题 但是看这个文件和search的结果里改的文件 多少有些不一样 报错
  • 使用boost::gil模块进行像素重采样的数字扩展示例(C/C++)

    使用boost gil模块进行像素重采样的数字扩展示例 C C 在图像处理中 像素重采样是一种常见的操作 它可以改变图像的分辨率或者调整图像的大小 在C 中 Boost库提供了Gil模块 其中包含了一些用于图像处理的功能 包括像素重采样 本
  • 数据库表中有多个“主键“

    数据库表中的多个主键称为联合主键 sql 中一个表设置两个主键是 将两个字段联合起来设置为主键 一个表只能有一个主键 1 只有id为主键时 2 id和name这2个列一起构成为联合主键时 甚至可以全部字段设置为主键
  • 11.14 Python __file__属性:查看模块的源文件路径

    前面章节提到 当指定模块 或包 没有说明文档时 仅通过 help 函数或者 doc 属性 无法有效帮助我们理解该模块 包 的具体功能 在这种情况下 我们可以通过 file 属性查找该模块 或包 文件所在的具体存储位置 直接查看其源代码 仍以
  • AFX_MANAGE_STATE(AfxGetStaticModuleState())讲解

    以前写MFC的DLL的时候 总会在自动生成的代码框架里看到提示 需要在每一个输出的函数开始添加上AFX MANAGE STATE AfxGetStaticModuleState 一直不明白这样做的含义 也一直没有这样做 而且代码也工作得好好
  • R语言学习:数据结构4-列表

    列表 list 可以包含不同类型的对象 创建列表 命名 创建多维元素列表 list x lt list a 10 2L 1 2i TRUE x1 lt list a 1 b 2 c 3 给列表里的元素命名 x2 lt list c 1 2
  • JDK11,JDK12,没有JRE的解决方法

    JDK11 JDK12 没有JRE的解决方法 1 以管理员身份运行CMD并输入cd C Program Files Java jdk 12 0 1 2 使用命令bin jlink exe module path jmods add modu
  • 前端面试的话术集锦第 3 篇:进阶篇上

    这是记录前端面试的话术集锦第三篇博文 进阶篇上 我会不断更新前端面试话术的博文 1 谈谈变量提升 当执 JS代码时 会 成执 环境 只要代码不是写在函数中的 就是在全局执 环境中 函数中的代码会产 函数执 环境 只此两种执 环境 b cal
  • jdbc实现oracle自动重连机制,JDBC实现Mysql自动重连机制的方法详解

    前言 本文主要给大家介绍的是关于JDBC实现Mysql自动重连机制的相关内容 分享出来供大家参考学习 下面来一起看看详细的介绍 日志 using the Connector J connection property autoReconne
  • java中调用方法传值问题详解

    背景 最近 我在用java写代码过程中遇到了这么个情况 通过调用 方法 来修改 值 有时候能成功 有时候却失败 让我百思不得其解 于是 这篇博文诞生了 与大家一起分享一下我的使用心得 基础知识 想要搞清楚这个问题之前 我们得清楚的明白 在