java 方法中的形参传值

2023-10-27

今天看到一个String传值问题,才发现以前的认知都是错的,为防止以后忘记,写下来。
先来看一个问题:

public static void main(String[] args){
    String a="abc";
    String b="bcd";
    change(a,b);
    System.out.print("a为:"+a+"\n");
    System.out.print("b为:"+b);
}
public void change(String a,String b){
    a=b;
    b=a+b;
}

这个输出结果是什么呢?
结果是: a为:abc
b为:bcd
这事为什么呢?不是a和b经过change方法改变了值吗?
首先这里要弄清楚一个概念:String类型的值是不可变的,也就意味String类型在创建后这个对象就是不可变的。所以a和b的值变没变就看它引用的String对象变没变。而String类型在方法中作为参数时,和基本类型一样传递的是他的值,也就是在change方法中a和b只是接受到了实参a和b的值而不是它的引用,即change(a,b)就是change(“abc”,”bcd”);所以这个方法并没有改变原来的a和b的引用对象,他们引用还是之前的”abc”和”bcd”。所以a和b的输出结果都不回变。在这里就要重点说明一点,String类型在方法中传递的是值而不是引用。所以一般在方法中进行操作都不回影响原来的值。
要是StringBuffer呢?

   public static void main(String[] args){
    StringBuffer a=new StringBuffer("abc");
    StringBuffer b=new StringBuffer("bcd");
    change(a,b);
    System.out.print("a为:"+a+"\n");
    System.out.print("b为:"+b);
}
public void change(StringBuffer x,StringBuffer y){
    x=y;
    y=x.append(y);
} 

输出结果:a为:abc
b为:bcdbcd
由于除了String以外的引用类型对象在传递参数时传递的是引用(本质上还是值,就是a和b的引用值),也就是这里有四个引用,a,b,x,y。其中a,x引用的对象为”abc”,b,y引用的对象为”bcd”;执行”x=y”时,x引用的对象由”abc”变成了”bcd”,此时b,x,y都是引用同一个对象”bcd”;a还是引用”abc”对象。执行”y=x.append(y)”时:由于x和y引用的是”bcd”对象,所以执行完后对象”bcd”变成了”bcdbcd”,但x,y,b还是引用此对象,所以输出的b为:bcdbcd;而a为:abc。
综上所述,java方法参数传递中传递的都是值,但基本类型和String传递的就是基本类型的值,而引用类型传递的值是引用,所以在方法中要看引用变没变,所引用的对象变没变。
希望上述对各位有所帮助,在下菜鸟一枚,欢迎大牛指教。

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

java 方法中的形参传值 的相关文章

  • Gradle 同步失败:配置项目“:lib”时出现问题

    我正在尝试在 android studio 中构建一个项目 但它总是失败 并出现名为 org gradle api ProjectConfigurationException A problem occurred configuring p
  • 删除 PriorityQueue 的顶部?

    假设我使用 Java util 中的 PriorityQueue 类 我想从 PriorityQueue pq 中删除最大的数字 我们假设它位于队列的头部 下面的工作会起作用吗 1 int head pq peek pq dequeue h
  • 将 4 个字节转换为无符号 32 位整数并将其存储在 long 中

    我正在尝试用 Java 读取二进制文件 我需要读取无符号 8 位值 无符号 16 位值和无符号 32 位值的方法 执行此操作的最佳 最快 最美观的代码 是什么 我在 C 中做到了这一点 并做了类似的事情 uint8 t buffer uin
  • 继续使用 sketch.js 编辑草图图像 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在使用 sketch js 中的示例 http intridea github io sketch js http intridea g
  • Java程序验证signtool签名的数字签名

    我已经使用 SignTool 对文件 exe 或 dll 不是 jar 文件 进行了数字签名 Signtool还可以验证数字签名 但我的要求是使用java程序检查由signtool签名的文件的数字签名 我在互联网上搜索但没有找到任何信息 您
  • Powermockito 可以在非最终具体类中模拟最终方法吗?

    假设我有一个非最终具体类 具有如下所示的最终方法 public class ABC public final String myMethod return test test 可以嘲笑吗myMethod 调用时返回其他内容junit usi
  • jUnit 中每个 @Test 的不同拆卸

    有没有办法为 jUnit 中的每个 Test 定义不同的拆卸 Use the After注释来指示每个之后要运行的方法 Test 像这样的全套注释是 BeforeClass 首先 Tests are run Before 在每个之前 Tes
  • 无法获取未知属性“运行时”Gradle 7.0

    我最近切换到 gradle 7 0 现在无法构建我的项目 jar 并出现错误 无法获取 org gradle api internal artifacts configurations DefaultConfigurationContain
  • 通过代理从java发送电子邮件

    我使用 Java Mail API 来发送和接收电子邮件 现在我做这个项目的地方有一个代理服务器 我可以知道如何通过代理服务器从java发送电子邮件吗 请参阅此处的常见问题解答 http www oracle com technetwork
  • 从 java.util.TimeZone 转换为 org.joda.DateTimeZone

    在Java中如何将一个实例转换为java util TimeZone to org joda DateTimeZone并保持夏令时 Joda Time 处于维护模式 The 乔达时间 http www joda org joda time
  • 使用java将文件从GCS存储桶传输到SFTP服务器

    我能够从 GCS 存储桶读取文件 但所有库都喜欢jsch将文件传输到 SFTP 服务器时会查找文件路径 而不是内存中的文件 我不想将从GCS读取的文件写入磁盘 如何将内存中的文件传输到SFTP 我假设您想上传内存中的数据 JSch 实际上有
  • 如何更改使用 Google ReCaptcha 版本 2 时的错误消息?

    当为 Google ReCaptcha 版本 2 选择多张照片时 会显示以下错误消息 需要多个正确的解决方案 请解决更多 如何将错误消息更改为我网站上的自定义消息 这是图像 我认为不可能在服务器端 在谷歌 进行 这可以在客户端通过利用 js
  • 为什么我用Java计算的结果是错误的?

    我使用这段代码来计算一些东西 但几乎在所有情况下结果都是 0 0 为什么 编译器中没有警告或错误 private void jButton1ActionPerformed java awt event ActionEvent evt try
  • Maven 依赖冲突:org.w3c.dom.ElementTraversal

    我有一个 Java 代码库 它使用 Maven 进行依赖项解析并在 CI 上运行测试 经过最近的一批开发 大到足以很难识别重大更改 我的一些测试现在在通过 Maven 运行时失败了NoClassDefFoundError for org w
  • 访问 JAR 资源

    我有一个jar包含我想要分发的资源 主要是缓存 日志记录等配置 的文件 我对这些资源的相对路径有问题 所以我做了我在另一个 stackoverflow 问题中发现的问题 该问题说这是一种有效的方法 ClassInTheSamePackage
  • 我们可以将请求分派到 servlet 内的 HTML

    这可能吗 RequestDispatcher rd request getRequestDispatcher index html rd forward request response 是的 您可以将请求分派到 HTML 页面
  • 列表中的“u”是什么意思?

    这是我第一次遇到这种情况 刚刚打印了一个列表 每个元素似乎都有一个u在它前面 即 u hello u hi u hey 它是什么意思 为什么列表的每个元素前面都会有这个 由于我不知道这种情况有多常见 如果您想了解我是如何遇到它的 我会很乐意
  • 给定一个字符串,如何删除所有重复的连续字母?

    如何从字符串中删除两个连续的字母 例如 a str hii thherre 应该成为 hi there 我尝试这样做 a str join sorted set a str key a str index 但是 我得到 hi ter 是的
  • 尝试 Catch 性能 Java

    当捕获异常而不是进行检查时 try catch 需要多长时间 以纳秒为单位 假设消息具有用于查找的 HashMap 类型性能 try timestamp message getLongField MessageField TIMESTAMP
  • java有类似C#的属性吗? [复制]

    这个问题在这里已经有答案了 C 属性 我的意思是 get 和 set 方法 是一个非常有用的功能 java 也有类似 C 的属性吗 我的意思是我们如何在 java 中实现类似以下 C 代码的内容 public string Name get

随机推荐

  • linux如何做到不丢日志,rsyslogd日志丢失的解决

    最近发现跑keepalived的几台机器的日志总是打印不完 还好给抛了一个报错 信息如下 root yw lvs2 backup etc tail n 1000000 var log messages 20130526 grep rate
  • c语言中如何实现生成随机数

    文章目录 一 rand 函数 二 rand srand 三 rand sranf time 一 rand 函数 c语言中自带的生成随机数的函数rand 只要引用头文件 include
  • Apache Kafka Connect JNDI注入漏洞 (CVE-2023-25194) 安全风险通告

    https mp weixin qq com s biz MzU5NDgxODU1MQ mid 2247497666 idx 1 sn b58717baf54fe52ec517b89fe370f589 chksm fe79d35ac90e5
  • 自动化测试用例要怎么写,据说这是最全的......

    前言 自动化测试是使用专门的软件工具来验证软件解决方案 这通常涉及自动化功能作为测试过程的一部分 测试自动化最常见的对象是 测试管理和缺陷管理 单元和单元集成测试 功能测试 回归测试 非功能测试 如性能和可扩展性 自动化测试用例的编写是实现
  • 学习日记——《MQTT-JX》例程讲解(完结版)

    头文件 include ets sys h include driver uart h include osapi h include mqtt h include wifi h include config h include debug
  • 程序员思维方式

    今天去设备部修电脑的时候 看到他们部门在讨论个商业题目 看他们的津津有味 如痴如醉 吊起了我的无限兴趣 临走时让那妹子给我发了份邮件 回去好好研究研究 现将题目共享出来 和大家一起讨论讨论 据说这是一道可以测出一个人有没有商业头脑的数学题
  • NetCore连接MySQL

    打开VS 工具 NuGet包管理器 管理解决方案的NuGet程序包 搜索MySql Data并安装 测试连接MySQL的代码 using System using System Collections Generic using Syste
  • vue使用qrcode

    借鉴 vue中使用qrcode 生成二维码 有蝉的博客 CSDN博客 qrcode vue一 安装qrcode jsnpm install save qrcode二 封装生成二维码的组件index vue
  • 如何理解递归

    基本思想 写好递归要掌握几个技巧 1 明确递归函数的作用 将递归函数看作一个黑盒 我自己把该技巧称为黑盒思想 我认为黑盒思想对于理解递归有很大的作用 递归函数就是隐藏了很多细节 我们没必要去一步一步地模拟递归函数的运行 那样大脑也受不了 比
  • python:如何删除符合条件的图片

    import os import Image fileName fp open fileName rb im Image open fp fp close x y im size if x lt 300 or y lt 300 os rem
  • 自主设计,模拟实现 RabbitMQ - 多虚拟主机管理

    目录 前言 一 多虚拟主机管理 1 1 需求分析 1 1 1 回顾 1 1 2 实现方案 1 2 具体实现 lt
  • 学习 stm32 FATFS文件系统基础知识与示例应用

    文件系统 负责管理和存储文件信息的软件机构称为文件管理系统 简称文件系统 即在磁盘上组织文件的方法 理解 包含了对介质存储器进行地址 内容 读取操作的一些封装的功能API方便应用层直接使用 常用的文件系统 FAT FATFS NTFS 基于
  • 三色标记清除法

    文章目录 1 三色标记算法的概述 2 三色标记的过程 3 存在问题 3 1 错标 3 2 漏标 4 解决错杀问题 4 1 CMS 写屏障 增量更新 Incremental Update 4 2 G1 写屏障 原始快照 STAB 1 三色标记
  • 链表的应用:单元多项式的加法、减法、乘法

    使用链表来实现单元多项式的加法 减法 乘法 一个单元多项式的节点结构无非是这样的 系数域 指数域 链域 如下图 我们使用链表来模拟单元多项式的常见运算 其中 加法是其它运算的基础 减法 poly1 poly2 poly1 poly2 乘法
  • 异常介绍。

    异常 1 了解异常的概念 编写的程序是来源或超脱于现实生活的 生活中 不符合你预期情况的场景 就是出现异常了 程序中的异常 Scanner in new Scanner System in System out print 请输入被除数 i
  • Unity 划线 - 使用Image实现划线

    unity使用Image实现划线功能 unity中划线的方式有很多 LineRender OpenGL 记录像素点等方式都可以实现划线的功能 如想了解其他划线方式 请看我的另一篇文章 gt Unity OpenGL 实现 阴阳师画符 划线功
  • Construct2 第一次制作的小游戏

    简单聊聊我是怎么制作出这款游戏 游戏介绍 先简单介绍一下游戏玩法 这款游戏中你可以操控女孩上下左右移动 用鼠标点击丘比 女孩会向丘比发射向日葵 如果丘比被向日葵打中三次 丘比就会死亡 并伴有爆炸效果 如果女孩不小心碰到了丘比 女孩也会死亡
  • 阿里云服务器vCPU和CPU有区别吗?

    阿里云服务器vCPU是什么 vCPU和CPU有什么区别 CPU是指云服务器的中央处理器 一个CPU可以包含若干个物理核 一台云服务器ECS实例的CPU选项由CPU物理核心数和每核线程数决定 通过超线程HT Hyper Threading 技
  • Ubuntu开机进不去系统,出现/dev/sda4: clean

    目录 一 问题描述 二 解决方法 2 1查看ubuntu的内存 2 2解决方法 2 3额外清理 三 查看ubuntu内存 开机恢复后 一 问题描述 我是双系统 忙完后电脑关机 第二天再进入ubantu系统就进不去了 网上解决这个问题的有很多
  • java 方法中的形参传值

    今天看到一个String传值问题 才发现以前的认知都是错的 为防止以后忘记 写下来 先来看一个问题 public static void main String args String a abc String b bcd change a