Java中的方法傳參機制

1. 概述

Java中的方法傳參機制分為兩種:值傳遞(Pass by Value) 和 引用傳遞(Pass by Reference)。然而,Java中所有的參數傳遞都是值傳遞,只不過對于對象來說,傳遞的是對象的引用地址的副本。

2. 值傳遞(基本數據類型)
  • 定義:當方法的參數是基本數據類型時,實際上傳遞的是變量的值的副本。
  • 特點:
    • 方法內部對參數的修改不會影響到外部的實際變量。
  • 示例:
    public class PassByValueExample {public static void main(String[] args) {int a = 10;System.out.println("Before method call: " + a); // 輸出 10changeValue(a);System.out.println("After method call: " + a);  // 輸出 10}public static void changeValue(int x) {x = 20;System.out.println("Inside method: " + x);      // 輸出 20}
    }
    在這個例子中,雖然?changeValue?方法內部將?x?改為?20,但主函數中的?a?仍然保持為?10,因為傳遞的是?a?的值的副本。
3. 引用傳遞(對象類型)
  • 定義:當方法的參數是對象類型時,傳遞的是對象引用的副本(即對象在堆內存中的地址)。因此,方法內部可以修改對象的內容,這些修改會影響到外部的對象。

  • 特點:

    • 方法內部可以通過引用修改對象的狀態(如對象的屬性),但不能改變引用本身指向的對象。
  • 示例:

    class Person {String name;public Person(String name) {this.name = name;}
    }public class PassByReferenceExample {public static void main(String[] args) {Person person = new Person("Alice");System.out.println("Before method call: " + person.name); // 輸出 AlicechangeName(person);System.out.println("After method call: " + person.name);  // 輸出 Bob}public static void changeName(Person p) {p.name = "Bob";  // 修改對象的內容System.out.println("Inside method: " + p.name);          // 輸出 Bob}
    }

    在這個例子中,changeName 方法通過傳入的引用修改了 person 對象的 name 屬性,因此主函數中的 person.name 也發生了變化。

  • 注意:如果在方法內部重新分配一個新的對象給參數,則外部的對象不會受到影響。

    public class PassByReferenceExample {public static void main(String[] args) {Person person = new Person("Alice");System.out.println("Before method call: " + person.name); // 輸出 AlicereassignPerson(person);System.out.println("After method call: " + person.name);  // 輸出 Alice}public static void reassignPerson(Person p) {p = new Person("Charlie");  // 重新分配一個新的對象System.out.println("Inside method: " + p.name);           // 輸出 Charlie}
    }

    在這個例子中,雖然 reassignPerson 方法內部將 p 指向了一個新的 Person 對象,但由于傳遞的是引用的副本,主函數中的 person 仍然指向原來的對象。

4. 總結

Java 中的方法參數傳遞始終是值傳遞。

對于基本數據類型,傳遞的是變量的值。對于對象類型,傳遞的是對象引用的副本(即堆內存地址的拷貝),因此可以通過引用來修改對象的內容,但不能改變引用本身指向的對象。理解值傳遞和引用傳遞的區別有助于避免在編寫代碼時出現意外的行為,尤其是在處理復雜對象和集合時。

5. 實際應用建議

如果需要確保方法內部不修改原始對象,可以在方法內部創建對象的副本(深拷貝或淺拷貝)。

使用不可變對象(如?StringInteger?等)可以避免因引用傳遞而導致的副作用。

對于需要返回多個結果的情況,可以考慮使用封裝類或返回一個包含多個值的對象。

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

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

相關文章

C++——this關鍵字和new關鍵字

一、this 關鍵字1. 什么是 this?this 是 C 中的一個隱式指針,它指向當前對象(即調用成員函數的對象),在成員函數內部使用,用于引用調用該函數的對象。每個類的非靜態成員函數內部都可以使用 this。使用 thi…

Python中類靜態方法:@classmethod/@staticmethod詳解和實戰示例

在 Python 中,類方法 (classmethod) 和靜態方法 (staticmethod) 是類作用域下的兩種特殊方法。它們使用裝飾器定義,并且與實例方法 (def func(self)) 的行為有所不同。1. 三種方法的對比概覽方法類型是否訪問實例 (self)是否訪問類 (cls)典型用途實例方法…

FastGPT革命:下一代語言模型的極速進化

本文深度解析FastGPT核心技術架構,涵蓋分布式推理、量化壓縮、硬件加速等前沿方案,包含完整落地實踐指南,助你掌握大模型高效部署的終極武器。引言:當大模型遭遇速度瓶頸2023年,ChatGPT引爆全球AI熱潮,但企…

Geant4 安裝---Ubuntu

安裝工具 C/C工具包 sudo apt install build-essentialCmake sudo apt install -y cmakeccmake sudo apt install -y cmake-curses-gui安裝Qt可視化工具(不需要可視化可以不安裝) sudo apt-get install qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools qtcreator 安裝Ope…

Spring Boot中請求參數讀取方式

目錄 一、前言 二、六種參數讀取方式 1.RequestParam 2.PathVariable 3.RequestBody 4.RequestHeader 5.CookieValue 6.MatrixVariable 三、對比和搭配 1.適用方法類型及建議使用場景 2.建議使用的請求路徑注解 3. 多種參數同時使用 4.同一請求不同方案&#xff1f…

2025華為OD機試真題最新題庫 (B+C+D+E+2025A+2025B卷) + 在線OJ在線刷題使用(C++、Java、Python C語言 JS合集)(正在更新2025B卷,目前已收錄710道)

2025年,已經開始使用AB卷題庫,題目和往期一樣,舊題加新題的組合,有題目第一時間更新,大家可以跟著繼續學習,目前使用復用題較多,可在OJ上直接找到對應的AB卷學習,可以放心學習&#…

分析新舊因子相關性

計算一組新因子、并分析它們與已有因子間的相關性1. 導入庫和初始化環境功能代碼解析數據加載2. 定義新因子計算函數功能代碼解析因子 1:波動率過濾器(filter_001_1)因子 2:ATR 過濾器(filter_001_2)因子 3…

Unity Demo——3D平臺跳躍游戲筆記

今天是一個3D平臺跳躍游戲的筆記。我們按照以下分類來對這個項目的代碼進行學習:核心游戲系統 (Core Game Systems)核心游戲系統是IkunOdyssey項目的基礎,負責所有游戲對象(如玩家、敵人、道具等)的通用行為和物理交互。它通過實體…

【C語言】回調函數、轉移表、qsort 使用與基于qsort改造冒泡排序

文章目錄數組指針/指針數組函數指針函數指針數組函數指針數組用途(轉移表)回調函數qsort函數基于qsort改造冒泡排序源碼數組指針/指針數組 int arr1[5] { 1,2,3,4,5 };int (*p1)[5] &arr1; //p1是數組指針變量int* arr2[5] { 0 }; //arr2是指針數組指針數組是存放指…

vue3 uniapp 使用ref更新值后子組件沒有更新 ref reactive的區別?使用from from -item執行表單驗證一直提示沒有值

遇到這樣一個問題,我有個1個頁面A,一個from表單組件,一個form-item組件, 使用是這樣的,我在父組件A中使用 ,執行表單驗證一直提示沒有值咱們先來講一講ref 和reactive的區別 ref 用來創建一個基本類型或單…

PyQt5布局管理(QBoxLayout(框布局))

QBoxLayout(框布局) 采用QBoxLayout類可以在水平和垂直方向上排列控件,QHBoxLayout和 QVBoxLayout類繼承自QBoxLayout類。 QHBoxLayout(水平布局) 采用QHBoxLayout類,按照從左到右的順序來添加控件。QHBoxL…

Grok 4作戰圖刷爆全網,80%華人橫掃硅谷!清華上交校友領銜,95后站C位

來源 | 新智元短短兩年,馬斯克Grok 4的橫空出世,讓xAI團隊一舉站上AI之巔。昨日一小時發布會,Grok 4讓所有人大開眼界,直接刷爆了AIME 2025、人類最后的考試(HLE)兩大基準。這是狂堆20萬GPU才換來的驚人成果…

AI大模型(七)Langchain核心模塊與實戰(二)

Langchain核心模塊與實戰(二)Langchian向量數據庫檢索Langchian構建向量數據庫和檢索器批量搜索返回與之相似度最高的第一個檢索器和模型結合得到非籠統的答案LangChain構建代理通過代理去調用Langchain構建RAG的對話應用包含歷史記錄的對話生成Langchia…

Flutter基礎(前端教程①-容器和控件位置)

一個紅色背景的 Container垂直排列的 Column 布局中央的 ElevatedButton按鈕下方的白色文本import package:flutter/material.dart;void main() {runApp(const MyApp()); }class MyApp extends StatelessWidget {const MyApp({Key? key}) : super(key: key);overrideWidget bu…

CSS flex

目錄 flex-box和flex-item 主軸和副軸 ?編輯 flex-box的屬性 flex-direction flex-wrap flex-flow justify-content ?編輯?align-items align-content flex-item的屬性 flex-basis flex-grow flex-shrink flex flex-box和flex-item 當把一個塊級元素的displ…

【JMeter】執行系統命令

步驟如下: 添加JSP233 Sampler:右擊線程組>添加>取樣器>JSR223 Sampler2.填寫腳本,執行后查看日志。res "ipconfig".execute().text log.info(res)res "python -c \"print(11)\"".execute().text l…

AI Agent開發學習系列 - langchain之memory(1):內存中的短時記憶

內存中的短時記憶,在 LangChain 中通常指 ConversationBufferMemory 這類“對話緩沖記憶”工具。它的作用是:在內存中保存最近的對話歷史,讓大模型能理解上下文,實現連續對話。 對話緩沖記憶”工具 主要特點 只保留最近的對話內容…

uniapp實現微信小程序端圖片保存到相冊

效果圖展示 安裝插件海報畫板導入到項目里面&#xff0c;在頁面直接使用 <template><view><button click"saveToAlbum" class"save-button">保存到相冊</button><image :src"path" mode"widthFix" v-if&qu…

Java生產帶文字、帶邊框的二維碼

Java 生成帶文字、帶邊框的二維碼1、Java 生成帶文字的二維碼1.1、導入jar包1.2、普通單一的二維碼1.2.1、代碼示例1.2.2、效果1.3、帶文字的二維碼1.&#xff13;.&#xff11;、代碼示例1.3.2、效果2、帶邊框的二維碼2.1、代碼示例2.2、帶邊框的二維碼效果 1、Java 生成帶文字…

ARM單片機啟動流程(三)(棧空間綜合理解及相關實際應用)

文章目錄1、引出棧空間問題2、解決問題2.1、RAM空間2.2、RAM空間具體分布2.3、關于棧空間的使用2.4、棧溢出2.5、變量的消亡2.6、回到關鍵字static2.7、合法性的判斷1、引出棧空間問題 從static關鍵字引出該部分內容。 為什么能從static引出來&#xff1f; 在使用該關鍵字的…