關于JAVA方法值傳遞問題

1.1 前言

之前在學習C++語言的時候,將實參傳遞給方法(或函數)的方式分為兩種:值傳遞和引用傳遞,但在JAVA中只有值傳遞(顛覆認知,基礎沒學踏實)

參考文章:https://blog.csdn.net/aaaa_1111111/article/details/143747247

1.2 幾個值傳遞示例

1. Boolean類型值傳遞問題

demo

// Boolean類型
@Test
public void BooleanTest() {Boolean bool = false;transmitBoolean(bool);System.out.println(bool);
}
private void transmitBoolean(Boolean bool) {bool = true;
}

結果

false

原因分析

明明傳遞的是引用類型,為什么無法修改呢?

首先Java只支持值傳遞,此時的形參bool是實參的副本(即實參和形參的值都指向值=false的Boolean對象,但是形參時實參的拷貝副本),當我們在方法中修改形參bool的Boolean值的時候,因為Boolean 是不可變的對象,因此在方法中改變它的值時,它并不會影響原始的值,因此會創建一個新的對象并賦值給形參(即拷貝實參的副本),其并沒有影響到實參,因此在該方法調用結束后,實參的值還是false。

調用方法前,實參地址

在這里插入圖片描述

調用方法中,形參地址

在這里插入圖片描述

方法中修改Boolean值后,形參地址

在這里插入圖片描述

解決方法

  1. 使用 AtomicBoolean

AtomicBoolean 是一個可以在多線程環境下保證原子性的類,它是可變的。你可以使用 AtomicBoolean 來避免不可變性的問題。

import java.util.concurrent.atomic.AtomicBoolean;public class Main {public static void main(String[] args) {AtomicBoolean pd = new AtomicBoolean(false);method(pd);System.out.println(pd.get());  // 現在會打印 true}public static void method(AtomicBoolean if1) {if1.set(true);  // 修改 AtomicBoolean 的值}
}

AtomicBoolean 使用 get() 方法來獲取值,使用 set() 方法來修改值。

  1. 使用數組或者容器對象(例如 List):

如果你不想使用 AtomicBoolean,你還可以使用一個數組或容器(例如 List)來傳遞值,因為數組和容器是可變的。

public class Main {public static void main(String[] args) {Boolean[] pd = { false };method(pd);System.out.println(pd[0]);  // 現在會打印 true}public static void method(Boolean[] if1) {if1[0] = true;  // 修改數組中的值}
}
  1. 使用 Wrapper 類來返回新值:

如果你不想使用 AtomicBoolean 或容器,你可以通過方法的返回值來返回修改后的 Boolean 值。

public class Main {public static void main(String[] args) {Boolean pd = false;pd = method(pd);  // 方法返回修改后的 Boolean 值System.out.println(pd);  // 現在會打印 true}public static Boolean method(Boolean if1) {return true;  // 直接返回修改后的值}
}
2. Map類型值傳遞問題

demo

// Map
@Test
public void MapTest() {Map<String, String> map = new HashMap<>();map.put("hhh", "123");transmitMap(map);System.out.println(map);
}
private void transmitMap(Map map) {//map.put("hhh", "321");map = new HashMap();map.put("xixi", "321");
}

結果

{hhh=123}

原因分析

和1是一樣原因,在方法中對形參指向引用對象的更改只對形參有效,形參只是對實參的一個拷貝,不會對實參造成影響!

3.正常對象的值傳遞問題

demo

// 自定義引用類型
@Test
public void ClassTest() {A a = new A();a.setId(123L);a.setName("www");transmitClass(a);System.out.println(a);
}
private void transmitClass(A a) {a.setId(321L);a.setName("hhh");
}
@Data
public class A{private Long id;private String name;
}

結果

DemoApplicationTests.A(id=321, name=hhh)

原因

這里顯示的結果正確的,雖然形參是對實參的拷貝,但是修改的內容都是對同一個堆中對象的修改。所以在方法調用后,可以完成對內容的修改。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/64421.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/64421.shtml
英文地址,請注明出處:http://en.pswp.cn/web/64421.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Excel基礎知識

一&#xff1a;數組 一行或者一列數據稱為一維數組&#xff0c;多行多列稱為二維數組&#xff0c;數組支持算術運算&#xff08;如加減乘除等&#xff09;。 行&#xff1a;{1,2,3,4} 數組中的每個值用逗號分隔列&#xff1a;{1;2;3;4} 數組中的每個值用分號分隔行列&#xf…

基于DIODES AP43781+PI3USB31531+PI3DPX1207C的USB-C PD Video 之全功能顯示器連接端口方案

隨著USB-C連接器和PD功能的出現&#xff0c;新一代USB-C PD PC顯示器可以用作個人和專業PC工作環境的電源和數據集線器。 雖然USB-C PD顯示器是唯一插入墻壁插座的交流電源輸入設備&#xff0c;但它可以作為數據UFP&#xff08;上游接口&#xff09;連接到連接到TCD&#xff0…

gazebo_world 基本圍墻。

如何使用&#xff1f; 參考gazebo harmonic的官方教程。 本人使用harmonic的template&#xff0c;在里面進行修改就可以分流暢地使用下去。 以下是world 文件. <?xml version"1.0" ?> <!--Try sending commands:gz topic -t "/model/diff_drive/…

解決無法在 Ubuntu 24.04 上運行 AppImage 應用

在 Ubuntu 24.04 中運行 AppImage 應用的完整指南 在 Ubuntu 24.04 中&#xff0c;許多用戶可能會遇到 AppImage 應用無法啟動的問題。即使你已經設置了正確的文件權限&#xff0c;AppImage 仍然拒絕運行。這通常是由于缺少必要的庫文件所致。 問題根源&#xff1a;缺少 FUSE…

Pytorch使用手冊-DCGAN 指南(專題十四)

1. Introduction 本教程將通過一個示例介紹 DCGANs(深度卷積生成對抗網絡)。我們將訓練一個生成對抗網絡(GAN),在給它展示大量真實名人照片后,它能夠生成新的“名人”圖片。這里的大部分代碼來源于 PyTorch 官方示例中的 DCGAN 實現,而本文檔將對該實現進行詳細解釋,并…

springboot配置oracle+達夢數據庫多數據源配置并動態切換

項目場景&#xff1a; 在工作中很多情況需要跨數據庫進行數據操作,自己總結的經驗希望對各位有所幫助 問題描述 總結了幾個問題 1.識別不到mapper 2.識別不到xml 3.找不到數據源 原因分析&#xff1a; 1.配置文件編寫導致識別mapper 2.配置類編寫建的格式有問題 3.命名…

html+css+js網頁設計 美食 家美食1個頁面

htmlcssjs網頁設計 美食 家美食1個頁面 網頁作品代碼簡單&#xff0c;可使用任意HTML輯軟件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html編輯軟件進行運行及修改編輯等操作&#xff09;。 獲取源碼 1&#xf…

【機器學習】【樸素貝葉斯分類器】從理論到實踐:樸素貝葉斯分類器在垃圾短信過濾中的應用

&#x1f31f; 關于我 &#x1f31f; 大家好呀&#xff01;&#x1f44b; 我是一名大三在讀學生&#xff0c;目前對人工智能領域充滿了濃厚的興趣&#xff0c;尤其是機器學習、深度學習和自然語言處理這些酷炫的技術&#xff01;&#x1f916;&#x1f4bb; 平時我喜歡動手做實…

Vue使用Tinymce 編輯器

目錄 一、下載并重新組織tinymce結構二、使用三、遇到的坑 一、下載并重新組織tinymce結構 下載 npm install tinymce^7 or yarn add tinymce^7重構目錄 在node_moudles里找到tinymce文件夾&#xff0c;把里面文件拷貝一份放到public下&#xff0c;如下&#xff1a; -- pub…

odoo中@api.model, @api.depends和@api.onchange 裝飾器的區別

文章目錄 1. api.model用途特點示例 2. api.depends用途特點示例 3. api.onchange用途特點示例 總結 在 Odoo 中&#xff0c;裝飾器&#xff08;decorators&#xff09;用于修飾方法&#xff0c;以指定它們的行為和觸發條件。api.model、api.depends 和 api.onchange 是三個常用…

EMNLP'24 最佳論文解讀 | 大語言模型的預訓練數據檢測:基于散度的校準方法

點擊藍字 關注我們 AI TIME歡迎每一位AI愛好者的加入&#xff01; 點擊 閱讀原文 觀看作者講解回放&#xff01; 作者簡介 張偉超&#xff0c;中國科學院計算所網絡數據科學與技術重點實驗室三年級直博生 內容簡介 近年來&#xff0c;大語言模型&#xff08;LLMs&#xff09;的…

大數據技術-Hadoop(一)Hadoop集群的安裝與配置

目錄 一、準備工作 1、安裝jdk&#xff08;每個節點都執行&#xff09; 2、修改主機配置 &#xff08;每個節點都執行&#xff09; 3、配置ssh無密登錄 &#xff08;每個節點都執行&#xff09; 二、安裝Hadoop&#xff08;每個節點都執行&#xff09; 三、集群啟動配置&a…

PilotGo

title: 解鎖 PilotGo&#xff1a;智能化運維的得力助手 date: ‘2024-12-29’ category: blog tags: PilotGo運維管理智能化工具技術應用 sig: ops archives: ‘2024-12’ author:way_back summary: PilotGo 作為一款創新的運維管理工具&#xff0c;憑借其智能化的特性和豐富的…

折騰日記:如何讓吃灰筆記本發揮余熱——搭建一個相冊服務

背景 之前寫過&#xff0c;我在家里用了一臺舊的工作站筆記本做了服務器&#xff0c;連上一個綠聯的5位硬盤盒實現簡單的網盤功能&#xff0c;然而&#xff0c;還是覺的不太理想&#xff0c;比如使用filebrowser雖然可以備份文件和圖片&#xff0c;當使用手機使用網頁&#xf…

使用seata實現分布式事務管理

配置 版本說明&#xff1a;springCloud Alibaba組件版本關系 我用的是spring cloud Alibaba 2.2.1.RELEASE 、springboot 2.2.1.RELEASE、nacos 2.0.1、seata1.2.0,jdk1.8 seata 主要用于在分布式系統中對數據庫進行事務回滾&#xff0c;保證全局事務的一致性。 seata的使用…

【總結】動態規劃

線性dp LeetCode題單&#xff0c; 從記憶化搜索到遞推 Pre&#xff1a; 從最初狀態到最終狀態等價&#xff0c;那么從最終狀態開始和最初狀態開始結果一樣。 遞歸時不會產生其他負面結果&#xff0c;即無論何時進入遞歸&#xff0c;只要遞歸參數相同&#xff0c;結果就相同。 …

RabbitMQ中的異步Confirm模式:提升消息可靠性的利器

在現代分布式系統中&#xff0c;消息隊列&#xff08;Message Queue&#xff09;扮演著至關重要的角色&#xff0c;它能夠解耦系統組件、提高系統的可擴展性和可靠性。RabbitMQ作為一款廣泛使用的消息隊列中間件&#xff0c;提供了多種機制來確保消息的可靠傳遞。其中&#xff…

買賣預測工具

設計一個用于在交易市場中尋找確定性或大概率盈利的買賣預測工具是一個具有挑戰性但非常有潛力的項目。你可以通過以下幾個步驟進行思路規劃&#xff1a; 1. 明確目標 大概率盈利&#xff1a;工具的目的是找出大概率盈利的交易機會。不能完全依賴于100%確定性&#xff0c;因為…

【數據結構】數據結構簡要介紹

數據結構是計算機科學中用于組織、管理和存儲數據的方式&#xff0c;以便于高效地訪問和修改數據。 數據結構的分類&#xff1a; 數據結構可以大致分為兩類&#xff1a;線性結構和非線性結構。 1. 線性結構 線性結構中的數據按順序排列&#xff0c;每個元素有唯一的前驅和后…

note 41:賬務系統開發規范

目錄 系統設計 防重控制 流量控制 并發控制 異常處理 備份機制 系統開發??????? 前端隊列操作 外系統交互 ?????????????? 系統設計 防重控制 對于進入到系統中的數據&#xff08;文件導入、手工錄入、系統直連等&#xff09;以及本系統發往外…