Java方法參數傳遞的底層分析

来源:https://www.cnblogs.com/java265/archive/2022/07/05/16445786.html
-Advertisement-
Play Games

Hi,大家好,我是Mic 一個工作了3年的粉絲,在面試的時候遇到一個線程相關問題。 想讓我幫他解答一下。 問題是,“什麼是守護線程,它有什麼特點” 下麵看看高手的回答。 高手: 好的。 守護線程,它是一種專門為用戶線程提供服務的線程,它的生命周期依賴於用戶線程。 只有JVM中仍然還存在用戶線程正在運 ...


轉自:

 http://www.java265.com/JavaCourse/202206/3770.html

下文筆者講述java方法參數傳遞,到底傳遞了何種東西的詳細簡介說明,如下所示

在java的學習中,我們經常被問及一個問題,
 調用java的參數時,
 java是進行的值傳遞,還是進行的引用傳遞呢?
----------------------------------------------
筆者先告訴大家,java方法中的參數進行的值傳遞
  (基礎類型傳入的是實際值,引用類型傳入的指向引用類型的記憶體地址)
那麼可能有人會問:有些傳遞的對象,
   在方法裡面改變了值,外面也會發生變化,
   這是為什麼呢?下文筆者將一一道來,如下所示
----------------------------------------------

首先筆者會講述java參數存儲

  
在JVM的記憶體模型中
  有棧和堆
  棧是線程私有
  每個線程都有個私有的棧
  而堆是所有線程共用的 

方法在執行時,都會創建一個棧幀
  棧幀中的局部變數表是用來存儲一組變數值的記憶體空間
  用於存放方法參數和方法內部定義的局部變數
所以當我們做如下的代碼聲明時,是在棧上開闢記憶體空間存儲
int b = 8888;
User user= null;

如果我們創建對象時,user=new User()時,則會在堆上開闢記憶體空間,初始化User對象
然後再將User對象的地址賦值給user 

從以上的存儲方式,我們可以看出:
基本類型和引用類型都存在棧中
  引用指向的實際對象存在堆中

   public static void main(String[] args) {
        int a = 88;
        m1(a);
        System.out.println("main1 a="+a);

        User user = new User("java265");
        m2(user);

        System.out.println("main2 name="+user.getName());
        m3(user);
        System.out.println("main3 name="+user.getName());
    }

    public static void m1(int a1){
        a1 = 8;
        System.out.println("m1 a1="+ a1);
    }

    public static void m2(user user1){
        user1.setName("jjjjj");
        System.out.println("m1 name="+ user1.getName());
    }

    public static void m3(user user1){
        user1 = new user("555");
        System.out.println("m2 name="+ user1.getName());
    }

運行結果:

m1 a1=8
main1 a=88

m1 name=jjjjj
main2 name=jjjjj
m2 name=555
main3 name=jjjjj
從m1方法執行的結果可以驗證出
   當參數傳遞的是基本類型,將實參的值複製到方法的形參中
    即傳遞的是原始值的副本,操作副本不會影響原始值。

從m2方法執行的結果可以驗證出
   當參數傳遞的是引用類型,是將實參的引用拷貝到方法的行參中
 即:傳遞的是實參所引用的對象在堆中的地址值的副本
   引用用於訪問實際對象,也就意味著對形參進行修改會影響實參。

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

-Advertisement-
Play Games
更多相關文章
  • 1、樣式 1.1 行內樣式 <h1 style="color:red;">行內樣式</h1> 1.2 內部樣式 CSS代碼寫在 <head> 的 <style> 標簽中 <style> h1{color: green; } </style> 1.3 外部樣式 <link rel="styleshee ...
  • 本文簡介 你負責點贊,我負責更新~ 這次要用純CSS做一個波點背景,先上圖看看效果。 我把這個效果寫在 body 上,如果你不喜歡這個配色也可以自己手動改改。 思路 我實現上圖的效果思路是,最先想到使用 background-image ,然後使用 radial-gradient 畫圓。再配合預設給 ...
  • 講述在單片機軟體開發過程中如何更好地實現各個模塊的數據交互,降低耦合 ...
  • 恢復內容開始 選擇結構 選擇結構分為為i語句和switch語句 if語句 1.if單選擇語句 結構圖:(用輸出語句打了一個簡單結構圖) 代碼示例: public class IfDemo01 { public static void main(String[] args) { /*if單選擇語句 i ...
  • 搭建免費的代理ip池 需要解決的問題: 使用什麼方式存儲ip 文件存儲 缺點: 打開文件修改文件操作較麻煩 mysql 缺點: 查詢速度較慢 mongodb 缺點: 查詢速度較慢. 沒有查重功能 redis --> 使用redis存儲最為合適 所以 -> 數據結構採用redis中的zset有序集合 ...
  • 順序結構 java的基本結構有順序結構、選擇結構、迴圈結構。我們先來學習順序結構 java的基本結構就是順序結構,也就是java按照順序一步一步執行,除非有特殊說明。 順序結構也是最簡單的演算法結構 語句與語句之間,框與框之間是按從上到下的順序進行的,它是由若幹個一次執行的處理步驟組成的,它是任何一個 ...
  • 本系列Netty源碼解析文章基於 4.1.56.Final版本,公眾號:bin的技術小屋 前文回顧 在前邊的系列文章中,我們從內核如何收髮網絡數據開始以一個C10K的問題作為主線詳細從內核角度闡述了網路IO模型的演變,最終在此基礎上引出了Netty的網路IO模型如下圖所示: 詳細內容可回看《從內核角 ...
  • 基礎學的太枯燥了,當然需要用案例來實踐一下,才能更好的鞏固所學。 所以本次來個對手機號進行加密,檢驗我們所學~ 知識點: 文件讀寫 基礎語法 字元串處理 正則表達式 代碼部分 # 導入系統包 import platform import re print("Hello,秀兒") print("簡單的 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...