深刻理解Java中方法调用的参数传递

news2024/12/23 19:37:13

Java方法调用的参数传递

首先给结论:Java中均为值传递。
下面通过概念分析+代码示例的方式,实现深刻理解值传递的含义,避免死记硬背。

Java的两种数据类型

  1. 基本数据类型,比如int,double,boolean等,是从C语言中保留的类型。比如 int num = 10;在堆内存中存储结构如下:
    在这里插入图片描述
  2. 引用数据类型,比如Object类、及其子类,String类等。即使用Class定义的类。
    比如 String str = “hello”; 在堆内存中存储结构如下:
    在这里插入图片描述
    引用数据类型类似C中的指针。以C语言的代码来看,等价表达式为:p = “hello”。而方法调用时,传递的参数值为p,而非p;

代码示例

public class Test {
    
    public String s;

    Test(String s){
        this.s = s;
    }

    public void setS(String s, Test test){
    	test.s = s;
    }

    public void setNewS(String s, Test test){
        test = new Test(test.s);
        test.setS(s);
        System.out.println("setNewS:"+test.toString());
    }

    @Override
    public String toString(){
        return "s: " + this.s;
    }
    
    public static void main(String[] args) {
        Test test = new Test("1");
        /** 步骤1:打印结果为:s: 1 **/
        System.out.println(test.toString());
        test.setS("2");
        /** 步骤2:打印结果为: s: 2 **/
        System.out.println(test.toString());
        test.setNewS("3",test);
        /** 步骤3:打印结果为:s: 2 **/
        System.out.println(test.toString());
    }
}

步骤1中打印的结果是初始值1;
步骤2,调用setS(“2”,test),将test实例的属性s修改为2;
步骤3,调用setNewS(“3”,test),test的属性为何仍旧是2呢?
原因:setNewS方法中new 了一个新对象,赋值给引用test;通过内存图像表达:
在这里插入图片描述
使用new 在内存中创建了一个新Test对象,后续的修改基于这个新对象,原有的对象没有任何变化,仍旧由main方法中的test引用指向着。而setNewS方法中的test引用在该方法执行后,就被清理。

关键点

我们只看被调用方法内部:
理解的关键就是看方法中有没有调用new方法创建新的对象,并且将test引用指向新的对象。
如果这样做了,那么在方法内部对test引用的任何修改都将在新对象上生效。而和老对象无关。
如果没有这么做,那么方法内部对test引用的任何修改都会在老对象生效,那么main方法中再去打印该老对象的信息自然就发生变化了。

关于基本数据类型作为参数

基本数据类型作为参数传递时,传的就是值。
比如 int i = 0; add(i)和add(0的含义是一样的。因为基本数据类型没有引用一说,只有字面量,i代表的就是0;
比如

void add(int i){
	//方法内部的i是JVM新创建局部变量
	i = i + 1;
}
//方法外部的i是全局变量,不会因为add被改变
int i = 1;
add(i);
后续打印i的值仍旧为1,而不是2

所以我们在add中对i的任何修改都不可能改变外层 i 的值;

参考

https://www.zhihu.com/question/31203609

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1006657.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

flex布局实现 内容区域高度自适应

如果可以实现记得点赞分享&#xff0c;谢谢老铁&#xff5e; 一、背景说明 对于纵向排列布局&#xff0c;且上中下个个模块都是自动高度。当我们针对中间部分需要自适应高度且进行滚动时&#xff0c;那我们就可以用flex: 1 来处理。 二 、先看效果图 二 、flex布局 <!DO…

如何使用CMD恢复删除的分区?

分区删除后可以恢复吗&#xff1f; 磁盘分区旨在二级存储上创建一个或多个区域&#xff0c;然后你可以单独管理每个区域&#xff0c;这些区域就是分区。因此&#xff0c;对新安装的存储设备进行分区是很重要的环节&#xff0c;只有分区后才可以在这些设备上创建文件并保存数…

unity 使用声网(Agora)实现语音通话

第一步、先申请一个声网账号 [Agora官网链接]&#xff08;https://console.shengwang.cn/&#xff09; 第二步在官网创建项目 &#xff0c;选择无证书模式&#xff0c;证书模式需要tokenh和Appld才能通话 第三步 官网下载SDK 然后导入到unity&#xff0c;也可以直接在unity商店…

云链商城连锁门店新零售O20系统以零售商城

云链商城连锁门店新零售O20系统以零售商城、门店收银、多渠道进销存、客户管理、互动营销、导购助手、多种奖励模式和数据分析等功能&#xff0c;赋能多品牌连锁门店实现线上线下商品、会员、场景的互联互通&#xff0c;助推企业快速实现营销、服务、效率转型升级&#xff0c;为…

可编程交易区块为DeFi机器人提供强大动力

对于选择基金投资的人来说&#xff0c;一个基本指导原则就是寻找那些管理费最低的基金。资本应该是在运转&#xff0c;而不是用于支付费用。同样&#xff0c;Mysten Lab的Capy交易机器人利用可编程交易区块&#xff08;Programmable Transaction Blocks &#xff0c;PTBs&#…

文章生成器在线使用-自动生成文章的工具

大家好啊&#xff0c;今天我要和大家聊聊一个非常热门的话题——在线文章生成器。主要是帮助我们解决写作困扰&#xff0c;节省大量的时间和精力。我也常遇到常为了写一篇好文章而愁眉苦脸呢&#xff0c;我测试过可以帮助我们生成优质的文章&#xff0c;确实让我们的写作变得简…

1. 微信公众号申请加认证

文章目录 微信公众号申请流程指引微信公众号申请流程注册微信公众号申请完成银行卡账号验证 如何查询微信公众号审核通过登录微信公众号平台后&#xff08;如下图&#xff09;致电微信客服热线 微信公众号认证流程指引微信公众号认证流程选择 微信认证/开通选择验证方式。填写微…

运动耳机哪种类型好、最佳运动耳机推荐

很多人都有着运动的习惯&#xff0c;不论是为了解压放松还是为了健身减肥。而运动方式也是多种多样&#xff0c;包括骑行、跑步、游泳等。 作为“运动伴侣”的运动耳机&#xff0c;很多人都不知道该选择哪一款。通常都是建议大家再运动过程中佩戴专业的运动耳机&#xff0c;因为…

【图像处理】怎么让图片背景变透明?怎么改变图片中线条的颜色?在线PS软件

文章目录 前言一、打开图二、背景透明处理三、改变线条颜色总结 前言 我们处理图片将会使用到PS软件&#xff0c;如果安装了PS那直接打开使用。 如果没有安装PS&#xff0c;可使用在线PS软件&#xff1a; https://www.uupoop.com/#/ 一、打开图 第一步&#xff0c;从这个入口…

线性矩阵不等式(LMI)在控制理论中的应用

目录 &#xff08;一&#xff09;Matlab中的LMI处理工具包 &#xff08;二&#xff09;为什么LMI成为控制理论领域重要工具&#xff1f; &#xff08;三&#xff09;LMI在与Lyapunov不等式的关系 &#xff08;1&#xff09;线性矩阵不等式 &#xff08;2&#xff09;线性矩阵…

如何进行有效测试?——基于MEAP诞生的软件测试实用指南告诉你

近年来出现了一 些新的出版方式&#xff0c;MEAP(Manning Early Access Program)就是其中的一种&#xff0c;把开源运动扩展到出版行业。在MEAP中&#xff0c;读者可在图书出版前逐章阅读早期版本。在作者写作过程中&#xff0c;读者可以及时提供反馈&#xff0c;帮助作者写出更…

苹果发布会,华为成热搜第一?

文 | 琥珀消研社 作者 | April叶 琥珀消研社快评&#xff1a;雷蒙多给华为手机“代言”后&#xff0c;苹果库克又给华为“代言”了&#xff0c;苹果发布会当晚&#xff0c;华为竟然登顶热搜第一#苹果发布会 #华为 #Mate 60 Pro#手机#科技 苹果开发布会&#xff0c;华为却冲上…

Matplotlib | 高阶绘图案例【3】- 五大战区高校排名

文章目录 &#x1f3f3;️‍&#x1f308; 1. 导入模块&#x1f3f3;️‍&#x1f308; 2. 数据处理2.1 高效数据2.2 学校排名 &#x1f3f3;️‍&#x1f308; 3. 绘图3.1 绘制图布&#xff0c;设置极坐标系3.2 绘制学校排名柱状图3.3 绘制五大战区扇形区域3.4 添加战区、学校…

javaSE___语法基础(关键字、标识符、数据类型、字符、字符串、运算符)

语法基础 一、关键字的概述和使用二、标识符的概述和组成规则三、标识符中常见的命名规则四、数据类型的概述和分类五、数据类型的概述和分类六、数据类型转换之强制转换七、数据类型转换之强制转换超出范围八、字符和字符串参与运算九、算术运算符的基本用法十、算术运算符和-…

闭包的理解

1.什么是闭包&#xff1f; 变量的私有化。一个函数内的变量,随着函数的执行完毕,对于的变量也会随着销毁,闭包可以让变量在函数执行完毕之后不必销毁,通常将这个变量通过匿名函数的形式return出去,这个变量只能被访问,不能被修改。 2.证明变量执行玩被销毁 (1)函数体没有被包…

((type *)0)->member的用法

问题缘由&#xff0c;在学习 rt-thread 内核的时候遇到了这么一行代码&#xff1a; to_thread rt_list_entry(rt_thread_priority_table[0].next,struct rt_thread, tlist); 而 rt_list_entry 的宏定义如下&#xff1a; /* 已知一个结构体里面的成员的地址&#xff0c;反推…

利用 Python 中的地理空间数据与 GeoPandas

推荐&#xff1a;使用 NSDT编辑器快速搭建3D应用场景 空间数据的真正潜力在于它能够连接数据点及其各自的位置&#xff0c;为高级分析创造无限的可能性。地理空间数据科学是数据科学中的一个新兴领域&#xff0c;旨在利用地理空间信息并通过空间算法和机器学习或深度学习等先进…

Android:使用命令行发现keytool不是内部命令解决办法

一、前言&#xff1a;最近在搞引入高德地图的SDK&#xff0c;发现需要给app签名打包。记录一下。 二、当我在命令行中输入keytool的时候说keytool不是内部命令 解决方案&#xff1a; 找到系统属性--------高级----------点击环境变量 双击点开 找到java\jre1.8.0_202\bin新建…

GLTF在线编辑器

GLTF在线编辑器提供了一个内置的模型查看器&#xff0c;可以加载和预览 glTF/glb 文件。用户可以在不用安装任何插件的情况下直接在浏览中快速查看和编辑器3D模型。 它的功能特点如下&#xff1a; 1、打开GLTF模型 用户可以在GLTF编辑器中拖入GLB/GLTF模型或者选择打开本地GL…

Bootstarp4 设计网页轮播组件

很多网站都有广告轮播功能&#xff0c;可使用bootstrap4中的carousel组件非常简单的实现。 目录 下载bootstrap4 轮播功能实现 简单实现轮播组件 增加标识图标 增加标题和说明 切换淡入淡出 设置数据间隔 总结 下载bootstrap4 下载 Bootstrap Bootstrap v4 中文文档 …