Java 变量参数传入方法,修改后是否影响外面的值

Java中参数的传递 1.Java是值传递还是引用传递? 这是一个有点争议,但又没什么争议的问题,如果问起来你大可以回答他是值传递。下面就让我们来了解一下关于Java中有关参数传递的问题 2.什么是值传递,什么是引用传递? 值传递: 值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。(基本数据类型复制的是它本身的值,而引用数据类型复制的是它的地址。所以说如果将一个基本数据类型和一个引用数据类型的变量传进函数,基本数据类型的函数外的实际值是不会受影响的,而.. 阅读详情
public class Test2 {

    public static void setValue(String str){
        str = "ss";
    }
    public static void setValue(Man str){
        str = new Man("test");
    }

    public static class Man{
        private String name;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public Man(String name) {
            this.name = name;
        }

        @Override
        public String toString() {
            return "Man{" +
                    "name='" + name + '\'' +
                    '}';
        }
    }

    public static void main(String[] args) {

        String str = "s";
        setValue(str);

        System.out.println(str);


        Man man = null;
        setValue(man);
        System.out.println(man);

    }
}

如上面代码实践,结果输出 

s
null

原因是方法在执行的时候有栈帧的概念,入栈的时候只是压栈方法参数是传入参数的副本。

JVM高级特性

此时区分数据类型:基本类型和引用类型

基本类型:值存放在局部变量表中,无论如何修改只会修改当前栈帧的值,方法执行结束对方法外不会做任何改变;此时需要改变外层的变量,必须返回主动赋值。

引用数据类型:指针存放在局部变量表中,调用方法的时候,副本引用压栈,赋值仅改变副本的引用。但是如果直接改变副本引用的值,修改了引用地址的对象,此时方法以外的引用此地址对象当然被修改。(两个引用,同一个地址,任何修改行为2个引用同时生效)

比如

public static void setValue(StringBuilder str){
        str = new StringBuilder("sss");
    }
    
    public static void setValue2(StringBuilder str){
        str.append("sss");
    }


    public static void main(String[] args) {

        StringBuilder str = new StringBuilder();
        setValue(str);

        System.out.println(str.toString()); //输出空字符串


        setValue2(str);
        System.out.println(str.toString()); //输出sss

    }

关于String,本质是final类型char数组,不可修改,只能赋值,在做参数传入方法修改时,其实是新建对象,必须返回重新对外面的变量赋值才会对外面的String引用生效。

看String源码的任意一个方法即可明白

/**
     * Returns a string resulting from replacing all occurrences of
     * {@code oldChar} in this string with {@code newChar}.
     * <p>
     * If the character {@code oldChar} does not occur in the
     * character sequence represented by this {@code String} object,
     * then a reference to this {@code String} object is returned.
     * Otherwise, a {@code String} object is returned that
     * represents a character sequence identical to the character sequence
     * represented by this {@code String} object, except that every
     * occurrence of {@code oldChar} is replaced by an occurrence
     * of {@code newChar}.
     * <p>
     * Examples:
     * <blockquote><pre>
     * "mesquite in your cellar".replace('e', 'o')
     *         returns "mosquito in your collar"
     * "the war of baronets".replace('r', 'y')
     *         returns "the way of bayonets"
     * "sparring with a purple porpoise".replace('p', 't')
     *         returns "starring with a turtle tortoise"
     * "JonL".replace('q', 'x') returns "JonL" (no change)
     * </pre></blockquote>
     *
     * @param   oldChar   the old character.
     * @param   newChar   the new character.
     * @return  a string derived from this string by replacing every
     *          occurrence of {@code oldChar} with {@code newChar}.
     */
    public String replace(char oldChar, char newChar) {
        if (oldChar != newChar) {
            int len = value.length;
            int i = -1;
            char[] val = value; /* avoid getfield opcode */

            while (++i < len) {
                if (val[i] == oldChar) {
                    break;
                }
            }
            if (i < len) {
                char buf[] = new char[len];
                for (int j = 0; j < i; j++) {
                    buf[j] = val[j];
                }
                while (i < len) {
                    char c = val[i];
                    buf[i] = (c == oldChar) ? newChar : c;
                    i++;
                }
                //String的value 是final char[],一旦创建不能改变
                return new String(buf, true);
            }
        }
        return this;
    }

引用类型会引起浅拷贝和深拷贝现象。

Python传入参数的几种方法 Python唯一支持的参数传递方式是『共享传参』(call by sharing) 多数面向对象语言都采用这一模式,包括Ruby、Smalltalk和Java(Java的引用类型是这样,基本类型按值传递) 共享传参是指函数的各个形式参数获得实参中各个引用的副本;也就是说,函数内部的形参是实参的别名(alias) 这种方案的结果是,函数可能会修改作为参数传入的可变对象,但是无法修改那些对象的标识(即... 阅读详情

相关推荐

QDMA工程搭建/windows驱动编译与性能测试

请注意,根据您的目标操作系统,您可能需要在windows启动配置中启用测试签名的驱动程序,以便启用此驱动程序的安装。右键单击设备,选择更新驱动程序软件,然后选择构建的QDMA驱动程序的文件夹(通常为。创建一个新工程,在IP Catalog中搜索QDMA,双击创建qdma ip核。驱动程序安装安装驱动程序最简单的方法是通过Windows的“设备管理器”。如果系统提示未经验证的驱动程序发布者,请选择无论如何安装此驱动程序软件。本节主要介绍QDMA驱动在Windows系统的源文件、编译和安装过程。

qq_28455081的博客 2286

Java函数中传入引用变量,然后用引用变量生成新的对象所引发的问题

传入引用变量,然后生成新的对象并不会改变原来的对象通过引用变量修改对象传入的是引用变量的一份拷贝,但是二者指向相同的对象关于拷贝的代码示例示例1示例2示例3函数中使用引用变量的拷贝 来生成新的对象代码示例 通过引用变量修改对象 像一个函数中传入引用变量,该变量指向一个堆中的一个对象。 如果利用该特性,可以通过引用变量修改堆中的对象(类比C中的指针 ) 传入的是引用变量的一份拷贝,但是二者指向相同的对象 关于拷贝的代码示例 import java.util.Arrays; public class Test

hush_quiet的博客 657

别再让步进电机‘发烧’了!用FOC闭环驱动实现精准力矩控制(基于P0斩波恒流版)

本文详细介绍了如何利用FOC闭环驱动技术(基于P0斩波恒流版)解决步进电机过热和力矩控制不精准的问题。通过对比传统开环控制的缺陷,展示了FOC在降低温度、提升精度和能效方面的显著优势,并提供了硬件配置、软件实现及性能优化的完整方案。

weixin_30872157的博客 566

JAVA修改函数传入参数值时对原值的影响

今天闲来无事,研究了一道题目 public class Test { public static class User { private String firstName; private String lastName; public String getFirstName() { return firstN

码农自留地 8702

【Cadence】PSS+PSTB/PAC仿真在开关电源稳定性分析中的关键应用

本文深入探讨了Cadence仿真工具中PSS+PSTB/PAC方法在开关电源稳定性分析中的关键应用。针对开关电源作为时变非线性系统的特性,传统STB仿真方法会失效。文章详细阐述了如何通过PSS分析找到周期稳态,并在此基础上利用PSTB或PAC进行精确的环路增益和小信号频响分析,为电源设计提供可靠的稳定性评估与补偿网络设计依据。

weixin_29276847的博客 522

安防相机宽动态(WDR)技术解析:从原理到实战应用

本文深入解析安防相机宽动态(WDR)技术原理,对比多次曝光与DOL-WDR等实现方式,并区分硬件WDR与数字WDR(DWDR)的本质差异。文章重点阐述了WDR在逆光出入口、夜间道路监控等五大典型场景的实战应用与调参技巧,旨在帮助用户根据实际需求正确选择与配置,确保监控系统在复杂光线下清晰成像。

weixin_29191081的博客 427

關於JAVA中String类以形参传递到函数里面,修改后外面引用不能获取到更改后的值

一、 最开始的示例 写代码最重要的就是实践,不经过反复试验而得出的说辞只能说是凭空遐想罢了。所以,在本文中首先以一个简单示例来抛出核心话题:public class StringAsParamOfMethodDemo {public static void main(String[] args) { StringAsParamOfMethodDemo StringAsParamOfMethodDe

Vincent 1万+

电磁场仿真软件:CST Studio Suite_(25).案例分析与实践

在电磁场仿真中,材料属性的设置至关重要。通过API,您可以轻松地设置和修改材料属性,以适应不同的仿真需求。通过以上案例分析和实践,您已经学会了如何在CST Studio Suite中进行二次开发。自动化仿真流程:批量创建和运行仿真项目、优化设计参数、生成报告。自定义仿真设置:设置材料属性、边界条件和激励源。数据处理与分析:读取仿真结果、数据可视化和数据导出。高级脚本开发:多线程仿真、集成机器学习和云仿真。这些技能将帮助您更高效地进行电磁场仿真,提高设计质量和工作效率。

kkchenjj的博客 1383

java方法参数传递,对传入值的影响

java方法参数传递,对传入值的影响

星空的日常博客,希望日常能给你帮助 1302

【工具篇】万字长文拆解 Otter.ai:语音转文字领域的「瑞士军刀」是如何炼成的?(附保姆级教程)

但需要注意,2024年欧盟已出台《AI转录伦理指南》,要求所有录音需获得参与者明确授权。举个真实案例:某硅谷创业团队用Otter.ai记录产品评审会,系统自动标红争议点并生成待办事项,会议效率提升40%。AIGC技术原理、 实时转录解析、 定价策略分析、 语音算法拆解、 多平台兼容测试、 深度学习框架、 空间计算专利。——无论是跨国会议、课堂讲座还是深夜灵感,它都能实时生成带时间戳的文本记录,准确率高达95%。(此处建议插入Otter.ai会议转录动图,展示实时字幕生成效果)(数据来源:综合参考文献整理)

商务合作|问题讨论|交流学习 请联系作者微信,加微信请务必注明来意,博客主页有联系方式 1258

L2tp环境搭建笔记- Openwrt平台

本文使用3台openwrt设备, 分别搭建L2TP服务和2个客户端, 进行端到端验证和局域网组网,并分析搭建过程中涉及的默认路由( defaultroute) 配置问题。

十年通信老兵的技术修炼之路——从3G到5G,从地面基站到卫星通信。 3388

java 方法改变int值_Java如何在方法中修改传入参数的值

今天看到一张帖子,楼主问Java如何在方法中修改传入参数的值。之前也经常被这个问题困扰,C++可以用指针或引用来实现,但是Java怎么办?先来举个例子吧,比如int i = 5,你把i做参数。java复制一个它的值过去,所以在方法里改的只是复制品。再如s = "want to change",这句其实只做了一件事,就是把s指向了新的String对象"want to change",而它原来的值却没...

weixin_42510188的博客 2105

标准测试测试数据STDF学习笔记

本文介绍了STDF(Standard Test Data Format)文件的结构与解析方法。首先详细说明了STDF记录的组成,包括记录头类型(REC_TYP和REC_SUB)、数据类型定义、时间日期格式以及无效数据标识。重点分析了25种主要记录类型的功能、数据内容和出现位置,如FAR、MIR、MRR等关键记录。然后介绍了基于pystdf开源工具的解析方法,包括自带脚本的使用和自编程解析流程,通过事件驱动机制处理数据流。特别指出测试数据是按照PIR→PTR/MPR/FTR→PRR的循环模式组织。文章为ATE

歌颂苦难的行为是无耻的; 1513

java改变传入参数的值

java改变传入参数的值

选择大于努力吗? 4975

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

String为什么无法在方法中修改原有string变量的值

题目 public class Exam10{ String str=new String("good"); char[]ch={'a','b','c'}; public static void main(String args[]){ Exam10 ex=new Exam10(); ex.change(ex.str,ex.ch); System.out.print(ex.str+" and "); System.out.print(ex.ch); }

m0_52410356的博客 1652

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

java的方法执行是否会改变外部传入对象的值(引用传递和值传递),这里为了老玩家方便,直接总结结论

java的方法执行是否会改变外部传入对象的值,这里为了老玩家方便,直接总结结论

质量不太好的博客 1024

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

java——关于定义的变量作为参数传递后原变量是否会被更改

关于方法中的参数,看到过这样一句话:被传递进去参数永远都只是副本,不论副本经过了再怎样的变化,只要不接收,原件永远都不会发生改变。最近看到了几道题目刷新了我对这句话的认识:这句话是不对的,或者说是不完全对的。 对于传递的基本数据类型(int 、byte等)来说,传递的参数的确像是副本一样,对原件没什么影响,但是如果传入的参数是原件的地址,那在传入参数的方法中改变的就是地址中的数据,也就是说,原件...

清杉夫人 1201

Java方法的参数传值

Java方法的参数传值问题解析。

hththt001的博客 454

之前咱们写 add 方法的时候,比如调用 add (10, 20),传两个数进去就能拿到和,对吧?但你有没有想过一个问题:要是我在方法里修改传入的参数值,外面的原变量会跟着变吗?比如写个方法把传入的数

数组是引用类型,classScores 存的是数组在内存里的 “地址”,传参的时候把这个地址复印一份给 scores,所以方法里的 scores 和外面的 classScores,指向的是同一个数组,改 scores [0],其实就是改了那个共同的数组,外面自然能看到变化。这是因为方法里的 scores 被改成了新数组的地址,相当于别人拿了你的钥匙复印件,却没去你家,反而自己买了个新房子,改新房子里的东西,自然和你家没关系了。咱们再总结一下,免得你记混:基本类型传参,改方法里的参数,原变量不变(传副本);

思索的涟漪,突破自我 307

Java函数中传入外部参数,到底能不能改变这个变量的值?

我们要记住一个原则 虽然没有用而且造成很多困惑 但是这个是“真理”。 但是在实际写代码的时候 会因此造成很多困惑。 如果传入的是基本类型的变量,那么不会改变变量值 如果传入的是含有基本类型的引用数据类型 比如说 int[] 那么在此函数里的任何操作会对这个变量造成影响。 如果传入的是String 虽然这是一个引用数据类型 但是因为这个类在定义的时候就是不可变的 所以不会改变这个字符串变量 如果传入的是引用类型的变量 那么会改变变量值。 ...

Tech in Pieces 3216

封装对象Integer类型的对象作为参数传递给一个方法时,外部的Integer值会受到影响吗

封装对象传入方法会修改方法外的值吗

qq_41159625的博客 999

Java中方法传值与传引用的理解

该文为转载总结 Java中的方法总是传值的,当方法中传入的是对象时,实际上是传递了对象引用的副本,当在方法中对该对象引用的副本进行修改时,相当于也影响了方法外的实参,但在方法中如果让传入对象引用副本引用了一个新的对象,则之后的改变不会影响到方法外传入的实参。 当方法中传入的是基本数据类型的时候,相当于传递了一个基本数据类型的副本,改变的是该副本的内容,故不会对方法外传入的实参造成影响。 Java中引用的使用理解可以类比于C里面的指针的使用。 eg. import java.io.Console; impor

hbhgf的博客 307

JAVA中String类以形参传递到函数里面,修改后外面引用不能获取到更改后的值

文章目录代码示例Java中的“传值”和“传引用”问题关于String参数传递问题的曲解之一——直接赋值与对象赋值 代码示例 首先来个例子说明下本文研究的内容: public class StringTest { private String aa = "1111"; private StringBuilder bb = new StringBuilder("bbbb"); private char ca = 'y'; private Character cr = 'z';

自救 唯有自强 2156

java引用类型值怎么改变_Java 中修改函数传入值:基本类型和引用类型

基本类型和引用类型 基本类型:值存放在局部变量表中,无论如何修改只会修改当前栈帧的值,方法执行结束对方法外不会做任何改变;此时需要改变外层的变量,必须返回主动赋值。 引用数据类型:指针存放在局部变量表中,调用方法的时候,副本引用压栈,赋值仅改变副本的引用。但是如果直接改变副本引用的值,修改了引用地址的对象,此时方法以外的引用此地址对象当然被修改。(两个引用,同一个地址,任何修改行为2个引用同时...

weixin_39928768的博客 1227
上一篇: AtomicInteger原理分析
下一篇: String字符串内存模型与拼接方式
fenglllle
博客等级 码龄8年 461粉丝 242原创
评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值