如何理解Java是按值传递

news2024/12/23 13:53:19

在 Java 中,参数传递有两种方式:按值传递(pass by value)和按引用传递(pass by reference)。然而,Java 中的参数传递方式实际上是按值传递的。

按值传递的含义是:

  • 在方法调用时,将实际参数的值(即变量存储的内容)传递给方法内部的形式参数。
  • 这意味着当你将一个变量作为参数传递给方法时,传递的是该变量的值而不是它在内存中的地址或引用。

理解Java按值传递的关键点在于:

  1. 操作的是值的副本: 当你将一个原始数据类型(如 intfloat 等)或对象引用(对象的内存地址)传递给一个方法时,方法得到的是该值的一个副本。

  2. 原始数据类型的情况: 对于原始数据类型,传递的是值的副本,因此在方法内部对形参的修改不会影响到原始变量的值。

  3. 对象引用的情况: 对于对象引用,传递的是引用的副本,即对象在内存中的地址的副本。在方法内部,对对象属性的修改会影响原始对象,但如果在方法内改变了引用指向一个新的对象,原始对象不会受到影响。

假设有一个类 Person

class Person {
    private String name;

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

然后有以下代码,目的是将创建的对象值进行交换:

public class SwapObjects {
    public static void main(String[] args) {
        // 创建两个Person对象
        Person person1 = new Person("Alice");
        Person person2 = new Person("Bob");
           
        System.out.println("Before swapping:");
        System.out.println("Person 1: " + person1.name);
        System.out.println("Person 2: " + person2.name);
        
     // 调用交换函数
        swapPersons(person1, person2);

        System.out.println("\nAfter swapping:");
        System.out.println("Person 1: " + person1.name);
        System.out.println("Person 2: " + person2.name);
    }

    public static void swapPersons(Person p1, Person p2) {
        // 交换两个Person对象
    	Person temp = p1;
        p1=p2;
        p2=temp;
    }
}

在这个例子中,创建了两个 Person 对象,分别命名为 "Alice" 和 "Bob"。然后通过 swapPersons 函数交换了这两个对象。最后,输出交换前后的结果。输出结果是:

Before swapping:
Person 1: Alice
Person 2: Bob

After swapping:
Person 1: Alice
Person 2: Bob

我们发现输出结果并没有交换,这是因为我们在方法内改变了引用指向一个新的对象,这样的结果就是新对象对应的值跟原对象的值产生交换效果,而原对象没有发生改变。

但是,当我们在方法内部对对象属性的修改是会影响原始对象。

如下代码,目的是将创建的对象属性进行交换:

public class SwapObjects {
    public static void main(String[] args) {
        // 创建两个Person对象
        Person person1 = new Person("Alice");
        Person person2 = new Person("Bob");
                
        System.out.println("Before swapping:");
        System.out.println("Person 1: " + person1.name);
        System.out.println("Person 2: " + person2.name);
        
     // 调用交换函数
        swapPersons2(person1, person2);

        System.out.println("\nAfter swapping:");
        System.out.println("Person 1: " + person1.name);
        System.out.println("Person 2: " + person2.name);
    }

    public static void swapPersons2(Person p1, Person p2) {
        // 交换两个Person对象的名字属性
        String tempName = p1.name;
        p1.name=(p2.name);
        p2.name=(tempName);
    }
}

在第二个例子中,同样创建了两个 Person 对象,分别命名为 "Alice" 和 "Bob"。然后通过 swapPersons 函数交换了这两个对象的名字属性。最后,输出交换前后的结果。

Before swapping:
Person 1: Alice
Person 2: Bob

After swapping:
Person 1: Bob
Person 2: Alice

我们发现输出结果交换了,在 swapPersons 函数内部进行了属性交换,但由于Java是按值传递的,实际上传递的是对象引用的副本,所以在函数外部仍然能够访问交换后的属性值。

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

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

相关文章

华为 Mate 60 Pro 拆解:陆制零件比率上升至47% | 百能云芯

近日,日经新闻联合研究公司Fomalhaut Techno Solutions对华为 Mate 60 Pro 进行了拆解,揭示了这款于8月发布的新型智能手机的成本结构。拆解结果显示,该手机的国产零部件比例达到了47%,相较于三年前的 Mate 40 Pro,提高…

2.FastRunner定时任务Celery+RabbitMQ

注意:celery版本和Python冲突问题 不能用高版本Python 用3.5以下,因为项目的celery用的django-celery 3.2.2 python3.7 async关键字 冲突版本 celery3.x方案一: celery3.xpython3.6方案二 : celery4.xpython3.7 解决celery执…

Accelerate 0.24.0文档 三:超大模型推理(内存估算、Sharded checkpoints、bitsandbytes量化、分布式推理)

文章目录 一、内存估算1.1 Gradio Demos1.2 The Command 二、使用Accelerate加载超大模型2.1 模型加载的常规流程2.2 加载空模型2.3 分片检查点(Sharded checkpoints)2.4 示例:使用Accelerate推理GPT2-1.5B2.5 device_map 三、bitsandbytes量…

计算机毕业设计选题推荐-幼儿园管理微信小程序/安卓APP-项目实战

✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

微机原理_10

一、单项选择题(本大题共15小题,每小题3分,共45分。在每小题给出的四个备选项中,选出一个正确的答案。) 1,将二进制数110110.01转换为十六进制为() A. 66.1H B. 36.4H C. 66.4 D. 36.2 2,一台计算机的字长是4个字节,含义是() A.能处理的最大…

soh估计:Data-driven prediction of battery cycle life before capacity degradation

文献思想 作者发现不同循环寿命的电池,第100次和第10次循环放电容量的差有不同,作者由这一现象,提取出了放电容量差的方差、平均值、最小值等特征,其中放电容量差的方差对数和循环寿命的对数的皮尔逊相关性高达-0.93,…

【精选】JavaScript语法大合集【附代码和超详细介绍以及使用】

JavaScript语法大合集 JavaScript引入到文件 嵌入到HTML文件中 <body><script>var num10;console.log(num);</script> </body>引入本地独立JS文件 <body><script src"./hello.js"></script> </body>引入网络来源…

leetcode:链表的中间结点

1.题目描述 题目链接&#xff1a;876. 链表的中间结点 - 力扣&#xff08;LeetCode&#xff09; 我们先看题目描述&#xff1a; 2.解题思路 我们用画图用快慢指针来解决这个问题 定义一个快指针fast&#xff0c;一个慢指针slow 快指针一次走两个结点&#xff0c;慢指针一次…

3GPP协议解读(一)_23.501_23.502_PDU Session_SMF与UDP的交互

UE发起计算服务申请后&#xff0c;网络侧处理的流程 UE发起服务的流程&#xff1a;service request网络侧处理服务涉及的通信数据通过PDU Session进行传输&#xff0c;涉及到SMF与UPF的交互。PDU Session的建立、管理全部由SMF&#xff08;Session Management Function&#x…

Docker与VM虚拟机的区别以及Docker的特点

01、本质上的区别 VM(VMware)在宿主机器、宿主机器操作系统的基础上创建虚拟层、虚拟化的操作系统、虚拟化的仓库&#xff0c;然后再安装应用&#xff1b; Container(Docker容器)&#xff0c;在宿主机器、宿主机器操作系统上创建Docker引擎&#xff0c;在引擎的基础上再安装应…

WordPress丸子小程序问题常见解决方案

WordPress丸子小程序问题常见解决方案 下载uniapp&#xff0c;导入项目。修改下图域名为自己的WP博客地址。&#xff08;如下图&#xff09; 发行微信小程序&#xff0c;如果显示不是项目所有者&#xff0c;请重新获取。 重新发行微信小程序&#xff0c;请打开微信开发者工具端…

【leaflet】学习笔记1-4

▒ 目录 ▒ &#x1f6eb; 导读开发环境 1️⃣ 改造greengis的leafletinsCodeinline-module服务器live-server 2️⃣ d1. 初见&#xff1a;Map、TileLayer说明/流程关键代码 3️⃣ d2. 多地图切换&#xff1a;Control.Layers说明/流程关键代码 4️⃣ d3. 标记&#xff1a;Marke…

【Proteus仿真】【51单片机】锂电池管理系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使用LCD1602显示模块、DS18B20温度传感器、PCF8691 ADC模块、按键、LED蜂鸣器模块等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示温度…

Git-概念与架构

GIT-概念与架构 一、背景和起源二、版本控制系统1.版本控制分类1.1 集中式版本控制1.2 分布式版本控制 2.Git和SVN对比2.1 SVN2.2 GIT 三、GIT框架1.工作区&#xff08;working directory&#xff09;2.暂存区&#xff08;staging area&#xff09;3.本地仓库&#xff08;local…

算法笔记-第五章-大整数运算

算法笔记-第五章-大整数运算 大整数运算大整数比较大整数加法大整数减法大整数乘法大整数乘法2大整数除法 大整数运算 一&#xff1a;使用数组存储整数的时候&#xff0c;整数的高位存储在数组的高位&#xff0c;整数的低位存储 在数组的低位 二&#xff1a;把整数按照字符串读…

除了chatGPT网站外,国内有些可以使用的AI网站 文心一言 讯飞星火 豆包 通义千问 人工智能网站 AI网站

2023年随着人工智能技术的不断发展&#xff0c;AI网站如ChatGPT等越来越受到人们的关注。这些网站具有多种作用&#xff0c;可以帮助人们更方便地获取信息、解决问题&#xff0c;甚至进行创作。 首先&#xff0c;AI网站可以提供智能问答服务。与传统的搜索引擎相比&#xff0c…

DAC实验(DAC 输出三角波实验)(DAC 输出正弦波实验)

DAC 输出三角波实验 本实验我们来学习使用如何让 DAC 输出三角波&#xff0c;DAC 初始化部分还是用 DAC 输出实验 的&#xff0c;所以做本实验的前提是先学习 DAC 输出实验。 使用 DAC 输出三角波&#xff0c;通过 KEY0/KEY1 两个按键&#xff0c;控制 DAC1 的通道 1 输出两种…

Educational Codeforces Round 20 A-E

文章目录 A. Maximal Binary MatrixB. Distances to ZeroC. Maximal GCDD. Magazine AdE. Roma and Poker A. Maximal Binary Matrix 思路&#xff1a;一道很有意思的构造&#xff0c;我们可以发现&#xff0c;按照下述&#xff0c;从外到内进行一层一层的构造一定是最优的。 …

计算机网络———ipv6简解

文章目录 1.前言&#xff1a;2. ipv6简单分析&#xff1a;2.1.地址长度对比2.2. ipv6包头分析2.3. ipv6地址的压缩表示&#xff1a;2.3. NDP&#xff1a;2.4. ipv6地址动态分配&#xff1a; 1.前言&#xff1a; 因特网地址分配组织)宣布将其最2011年2月3日&#xff0c;IANA (In…

LeetCode(25)验证回文串【双指针】【简单】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 验证回文串 1.题目 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s&…