Java的參數傳遞是值傳遞還是引用傳遞

来源:https://www.cnblogs.com/nnngu/archive/2018/01/17/8299724.html
-Advertisement-
Play Games

當一個對象被當作參數傳遞到一個方法後,在此方法內可以改變這個對象的屬性,那麼這裡到底是值傳遞還是引用傳遞? 答:是值傳遞。Java 語言的參數傳遞只有值傳遞。當一個實例對象作為參數被傳遞到方法中時,參數的值就是該對象的引用的一個副本。指向同一個對象,對象的內容可以在被調用的方法內改變,但對象的引用( ...


當一個對象被當作參數傳遞到一個方法後,在此方法內可以改變這個對象的屬性,那麼這裡到底是值傳遞還是引用傳遞? 
  答:是值傳遞。Java 語言的參數傳遞只有值傳遞。當一個實例對象作為參數被傳遞到方法中時,參數的值就是該對象的引用的一個副本。指向同一個對象,對象的內容可以在被調用的方法內改變,但對象的引用(不是引用的副本) 是永遠不會改變的。

 

Java的參數傳遞,不管是基本數據類型還是引用類型的參數,都是按值傳遞,沒有按引用傳遞!

 我們可以看一下microsoft的文檔中對按引用傳遞參數的定義(如下截圖):https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/ref#passing-an-argument-by-reference  

 

1、基本數據類型的參數

先來看一下基本數據類型的參數按值傳遞的例子:

TransferTest.java

public class TransferTest {
    public static void main(String[] args) {
        int num = 1;
        System.out.println("changeNum()方法調用之前:num = " + num);
        changeNum(num);
        System.out.println("changeNum()方法調用之後:num = " + num);
    }

    public static void changeNum(int x) {
        x = 2;
    }
}

運行結果:

 

這個傳遞過程的示意圖如下:

num作為參數傳遞給changeNum()方法時,是將記憶體空間中num所指向的那個存儲單元中存放的值1傳遞給了changeNum()方法中的x變數,而這個x變數也在記憶體空間中分配了一個存儲單元,這個時候,就把num的值1傳遞給了x的這個存儲單元中。此後,在changeNum()方法中對x的一切操作都是針對x所指向的這個存儲單元,與num所指向的那個存儲單元沒有關係了!

所以,在changeNum()方法調用之後,num所指向的存儲單元的值還是沒有發生變化,這就是所謂的“值傳遞”!值傳遞的精髓是:傳遞的是存儲單元中的內容,而不是存儲單元的引用!

 

2、引用類型的參數

同樣,先看一個例子:

TransferTest2.java  

 1 public class TransferTest2 {
 2     public static void main(String[] args) {
 3         Person person = new Person();
 4         System.out.println(person);
 5         change(person);
 6         System.out.println(person);
 7     }
 8 
 9     public static void change(Person p) {
10         p = new Person();
11     }
12 }
13 
14 /**
15  * Person類
16  */
17 class Person {
18 
19 }

  

運行結果:

 

可以看出兩次列印person的地址值是一樣的,即調用完change() 方法之後,person變數並沒有發生改變。

 

這個傳遞過程的示意圖如下:

 

當執行到第3行代碼時,程式在堆記憶體中開闢了一塊記憶體空間用來存儲Person類的實例對象,同時在棧記憶體中開闢了一個存儲單元用來存儲該實例對象的引用,即上圖中person指向的存儲單元。

當執行到第5行代碼時,person作為參數傳遞給change()方法,需要註意的是:person將自己存儲單元的內容傳遞給了change()方法的p變數!此後,在change()方法中對p的一切操作都是針對p所指向的存儲單元,與person所指向的那個存儲單元沒有關係了!

下一篇文章會分析如何用java語言實現按引用傳遞參數的效果

 

 

歡迎轉載,但請保留文章原始出處

本文地址:http://www.cnblogs.com/nnngu/p/8299724.html 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • \D元字元可以匹配非數字字元,等價於"[^0-9]"。 語法結構: (1).構造函數方式: (2).對象直接量方式: /\D/ 瀏覽器支持: (1).IE瀏覽器支持此方法。 (2).火狐瀏覽器支持此方法。 (3).谷歌瀏覽器支持此方法。 (4).opera瀏覽器支持此方法。 (5).safria瀏覽 ...
  • 眾所周知,雲計算可以劃分為以下幾個層次的服務——IaaS、PaaS和SaaS,而今天我們今天講的多租戶架構就是一種常見的 SaaS 軟體架構模式,或者說是商業模式。 通常,一個多租戶軟體指的是依托雲計算的彈性環境,搭建並使用一個單一的應用程式實例來服務多個客戶,每個客戶稱之為“租戶”來共用同一個軟體 ...
  • 概念:設計模式是一套被反覆使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。 以下是對上面有下劃線的關鍵字的通俗解釋: 優點: 設計模式可以幫助我們改良項目的代碼,增強代碼的健壯性、可擴展性,為以後開發和維護鋪平道路。有過開發經驗的人都知道一個項目的代碼設計好壞對之後開發的影響,特別是從事維護 ...
  • 註:本文章示例為C#代碼,設計模式通用任何編程語言,可放心閱讀 設計模式(3W1H) What?針對特定問題特出的特定的解決方案 Why?讓程式有更好的可擴展度 Where?一般情況下,開發中真正使用設計模式的地方不多。面試 JVM底層機制 模式 框架底層應用了很多設計模式 How?任何時候、任何場 ...
  • 解決方法一 重置視窗佈局: windows > perspective > reset perspective 解決方法二: 如果上述方法不好使,採用下麵的這種方法: 刪除workspace的/.metadata/.plugins/org.eclipse.core.resources/.projec ...
  • 堆和棧都是Java用來在RAM中存放數據的地方。 堆 (1)Java的堆是一個運行時數據區,類的對象從堆中分配空間。這些對象通過new等指令建立,通過垃圾回收器來銷毀。 (2)堆的優勢是可以動態地分配記憶體空間,需要多少記憶體空間不必事先告訴編譯器,因為它是在運行時動態分配的。但缺點是,由於需要在運行時 ...
  • 在上一篇文章中(Java的參數傳遞是值傳遞還是引用傳遞),主要分析了java語言的參數傳遞只有按值傳遞而沒有按引用傳遞。 先看一下微軟的C#文檔對按引用傳遞的定義(如下截圖):https://docs.microsoft.com/zh-cn/dotnet/csharp/language-refere ...
  • 瞭解就行了** 通過新建file建立含有標簽,標簽屬性##xml的格式如下,就是通過<>節點來區別數據結構的: <?xml version="1.0"?> <data> <country name="Liechtenstein"> <rank updated="yes">2</rank> <year ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...