国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

深入淺出Java中參數(shù)傳遞的原理

這篇具有很好參考價值的文章主要介紹了深入淺出Java中參數(shù)傳遞的原理。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。


前言

今天,想和大家聊聊關(guān)于java中的參數(shù)傳遞的原理,參數(shù)的傳遞有兩種,值傳遞和引用傳遞。

  • 值傳遞:是指在調(diào)用函數(shù)時將實(shí)際參數(shù)復(fù)制一份傳遞到函數(shù)中,這樣在函數(shù)中如果對參數(shù)進(jìn)行修改,將不會影響到實(shí)際參數(shù)。

  • 引用傳遞:是指在調(diào)用函數(shù)時將實(shí)際參數(shù)的地址傳遞到函數(shù)中,那么在函數(shù)中對參數(shù)所進(jìn)行的修改,將影響到實(shí)際參數(shù)。

基本類型傳遞

先來看看下面這段最基本的代碼:

@Test
public void test() {
    int n = 10;
    test01(n);
    System.out.println("最終結(jié)果n==" + n);
}

private void test01(int m) {
    System.out.println("修改之前m==" + m);
    m = 20;
    System.out.println("修改之后m==" + m);
}

輸出結(jié)果:

修改之前m==10
修改之后m==20
最終結(jié)果n==10

如果跟你預(yù)期的不同,那我想你還是沒有理解參數(shù)的值傳遞與引用傳遞的原理。

結(jié)合生活中的場景,深入理解一下值傳遞和引用傳遞:

你有一把鑰匙,當(dāng)你的朋友想要去你家的時候,如果你直接把你的鑰匙給他了,這就是引用傳遞。這種情況下,如果他對這把鑰匙做了什么事情,比如他在鑰匙上刻下了自己名字,那么這把鑰匙還給你的時候,你自己的鑰匙上也會多出他刻的名字。

你有一把鑰匙,當(dāng)你的朋友想要去你家的時候,你復(fù)刻了一把新鑰匙給他,自己的還在自己手里,這就是值傳遞。這種情況下,他對這把鑰匙做什么都不會影響你手里的這把鑰匙。

下面我們來畫圖更好的理解上述代碼的例子:

深入淺出Java中參數(shù)傳遞的原理

當(dāng)發(fā)生函數(shù)調(diào)用的時候 n 將自己傳入到 test01 方法中,同時將自己的值復(fù)制了一份并賦值給了一個新變量 m 從圖中可以看出這是 nm 兩個變量沒有一毛錢關(guān)系(m只是n的復(fù)制品),所以對 m 的修改并不會影響到 n。

如果想要改變n的值,可以使用方法的返回值:

n = test01(n);

引用類型傳遞

下面來看看引用類型的傳遞:

public class Dog {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

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

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                '}';
    }
}


@Test
public void test() {
    Dog dog1 = new Dog("小白");
    test01(dog1);
    System.out.println("最終結(jié)果dog==" + dog1);
}

private void test01(Dog dog) {
    System.out.println("修改之前 dog==" + dog);
    dog.setName("小黑");
    System.out.println("修改之后 dog==" + dog);
}

輸出結(jié)果:

修改之前 dog==Dog{name='小白'}
修改之后 dog==Dog{name='小黑'}
最終結(jié)果dog1==Dog{name='小黑'}

為了方便大家理解,還是畫圖來分析一下:

深入淺出Java中參數(shù)傳遞的原理

test 方法中我們創(chuàng)建了一個 dog1 的對象,該對象存放于堆內(nèi)存中,假設(shè)內(nèi)存地址為 0x1120 ,于是 dog1 這個變量便應(yīng)用了這塊內(nèi)存地址。

當(dāng)我們調(diào)用 test01 這個方法的時候會在該方法棧中創(chuàng)建一個變量 dog ,這個 dog 變量是由原本的入?yún)?dog1 復(fù)制而來,所以它所對應(yīng)的堆內(nèi)存依然是 0x1120;

所以當(dāng)我們通過 dog 這個變量修改了數(shù)據(jù)后,本質(zhì)上修改的是同一塊堆內(nèi)存中的數(shù)據(jù)。從而原本引用了這塊內(nèi)存地址的 dog1 也能查看到對應(yīng)的變化。

如果不理解上面的話,那么記住下面的兩句話就行了:

傳遞引用類型的數(shù)據(jù)時,傳遞的并不是引用本身,依然是值;只是這個值是內(nèi)存地址罷了。

因?yàn)榘严嗤膬?nèi)存地址傳過去了,所以對數(shù)據(jù)的操作依然會影響到外部。

那我們繼續(xù)看看下面的代碼,這種情況能否改變參數(shù)的值

@Test
public void test() {
    Dog dog1 = new Dog("小白");
    test01(dog1);
    System.out.println("最終結(jié)果dog1==" + dog1);
}

private void test01(Dog dog) {
    System.out.println("修改之前 dog==" + dog);
    dog = new Dog("小黑");
    System.out.println("修改之后 dog==" + dog);
}

輸出結(jié)果:

修改之前 dog==Dog{name='小白'}
修改之后 dog==Dog{name='小黑'}
最終結(jié)果dog1==Dog{name='小白'}

假設(shè) Java 是引用傳遞那最終的結(jié)果應(yīng)該是打印 小黑 才對,從結(jié)果看這里依然是值傳遞。

還是畫圖來分析一下:

深入淺出Java中參數(shù)傳遞的原理

如果是引用傳遞,原本的 0x1120 應(yīng)該是被直接替換為新創(chuàng)建的 0x1121 才對;而實(shí)際情況如上圖所示,dog 直接重新引用了一個對象dog = new Dog("小黑"),兩個對象之間互不干擾。

總結(jié)

Java中參數(shù)傳遞其實(shí)還是值傳遞的,只不過對于引用類型參數(shù),值的內(nèi)容是對象的引用。文章來源地址http://www.zghlxwxcb.cn/news/detail-427905.html

到了這里,關(guān)于深入淺出Java中參數(shù)傳遞的原理的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【樸素貝葉斯】深入淺出講解樸素貝葉斯算法(公式、原理)

    【樸素貝葉斯】深入淺出講解樸素貝葉斯算法(公式、原理)

    本文收錄于《深入淺出講解自然語言處理》專欄,此專欄聚焦于自然語言處理領(lǐng)域的各大經(jīng)典算法,將持續(xù)更新,歡迎大家訂閱! ?個人主頁:有夢想的程序星空 ?個人介紹:小編是人工智能領(lǐng)域碩士,全棧工程師,深耕Flask后端開發(fā)、數(shù)據(jù)挖掘、NLP、Android開發(fā)、自動化等

    2024年02月03日
    瀏覽(29)
  • 深入淺出Nginx的基本原理和配置指南「負(fù)載均衡篇」

    深入淺出Nginx的基本原理和配置指南「負(fù)載均衡篇」

    6.1 四層負(fù)載均衡 6.1.1 四層負(fù)載均衡與七層負(fù)載均衡的區(qū)別 四層負(fù)載均衡數(shù)據(jù)包是在底層就進(jìn)行了分發(fā),而七層負(fù)載均衡數(shù)據(jù)包則在最頂端進(jìn)行分發(fā),所以四層負(fù)載均衡的效率比七層負(fù)載均衡的要高。四層負(fù)載均衡不識別域名,而七層負(fù)載均衡識別域名。 6.1.2 四層負(fù)載均衡配

    2024年02月09日
    瀏覽(41)
  • 【深入淺出Spring Security(三)】默認(rèn)登錄認(rèn)證的實(shí)現(xiàn)原理

    【深入淺出Spring Security(三)】默認(rèn)登錄認(rèn)證的實(shí)現(xiàn)原理

    由默認(rèn)的 SecurityFilterChain 為例(即表單登錄),向服務(wù)器請求 /hello 資源Spring Security 的流程分析如下: 請求 /hello 接口,在引入 Spring Security 之后會先經(jīng)過一系列過濾器(一中請求的是 /test 接口); 在請求到達(dá) FilterSecurityInterceptor 時,發(fā)現(xiàn)請求并未認(rèn)證。請求被攔截下來,并

    2024年02月09日
    瀏覽(29)
  • 【C++深入淺出】初識C++上篇(關(guān)鍵字,命名空間,輸入輸出,缺省參數(shù),函數(shù)重載)

    【C++深入淺出】初識C++上篇(關(guān)鍵字,命名空間,輸入輸出,缺省參數(shù),函數(shù)重載)

    ? ?? 目錄 一. 前言 二. 什么是C++ 三. C++初探 四. 命名空間 4.1 為什么要引入命名空間 4.2 命名空間的定義 4.3 命名空間使用 五. C++的輸入輸出 六. 缺省參數(shù) 6.1 缺省參數(shù)的概念 6.2 缺省參數(shù)的分類 七. 函數(shù)重載? 7.1 函數(shù)重載的概念 7.2 函數(shù)重載的條件 7.3 C++支持函數(shù)重載

    2024年02月13日
    瀏覽(1106)
  • 深入淺出阿里數(shù)據(jù)同步神器:Canal原理+配置+實(shí)戰(zhàn)全網(wǎng)最全解析!

    深入淺出阿里數(shù)據(jù)同步神器:Canal原理+配置+實(shí)戰(zhàn)全網(wǎng)最全解析!

    canal 翻譯為管道,主要用途是基于 MySQL 數(shù)據(jù)庫的增量日志 Binlog 解析,提供增量數(shù)據(jù)訂閱和消費(fèi)。 早期阿里巴巴因?yàn)楹贾莺兔绹p機(jī)房部署,存在跨機(jī)房同步的業(yè)務(wù)需求,實(shí)現(xiàn)方式主要是基于業(yè)務(wù) trigger 獲取增量變更。從 2010 年開始,業(yè)務(wù)逐步嘗試數(shù)據(jù)庫日志解析獲取增量變

    2024年02月10日
    瀏覽(23)
  • 《深入淺出SSD:固態(tài)存儲核心技術(shù)、原理與實(shí)戰(zhàn)》----學(xué)習(xí)記錄(二)

    《深入淺出SSD:固態(tài)存儲核心技術(shù)、原理與實(shí)戰(zhàn)》----學(xué)習(xí)記錄(二)

    SSD主要由兩大模塊構(gòu)成—— 主控和閃存介質(zhì) 。其實(shí)除了上述兩大模塊外,可選的還有緩存單元。主控是SSD的大腦,承擔(dān)著指揮、運(yùn)算和協(xié)調(diào)的作用,具體表現(xiàn)在 一是實(shí)現(xiàn)標(biāo)準(zhǔn)主機(jī)接口與主機(jī)通信 二是實(shí)現(xiàn)與閃存的通信 三是運(yùn)行SSD內(nèi)部FTL算法 可以說,一款主控芯片的好壞直

    2024年02月12日
    瀏覽(25)
  • 深入淺出講解Stable Diffusion原理,新手也能看明白

    深入淺出講解Stable Diffusion原理,新手也能看明白

    最近一段時間對多模態(tài)很感興趣,尤其是Stable Diffusion,安裝了環(huán)境,圓了自己藝術(shù)家的夢想。看了這方面的一些論文,也給人講過一些這方面的原理,寫了一些文章,具體可以參考我的文章: 北方的郎:圖文匹配:Clip模型介紹 北方的郎:VQGAN(Vector Quantized Generative Adversar

    2024年02月08日
    瀏覽(22)
  • 【深入淺出 Spring Security(七)】RememberMe的實(shí)現(xiàn)原理詳講

    【深入淺出 Spring Security(七)】RememberMe的實(shí)現(xiàn)原理詳講

    先看看最簡單用法的默認(rèn)頁面效果變化。 SecurityConfig 配置類 測試 TestController 代碼 以下是給出的默認(rèn)的登錄頁面。 觀察頁面源代碼可以發(fā)現(xiàn),比原先沒配置 RememberMe 之前多了個 name 為 remember-me 的 checkbox 選項(xiàng)。 如果我們勾選了它并且登錄成功后,當(dāng)我們關(guān)閉掉當(dāng)前瀏覽器,

    2024年02月09日
    瀏覽(25)
  • 【前端工程化】深入淺出vite(一)--vite的優(yōu)點(diǎn)及原理、性能優(yōu)化

    【前端工程化】深入淺出vite(一)--vite的優(yōu)點(diǎn)及原理、性能優(yōu)化

    Vite 需要 Node.js 版本 14.18+,16+。然而,有些模板需要依賴更高的 Node 版本才能正常運(yùn)行,當(dāng)你的包管理器發(fā)出警告時,請注意升級你的 Node 版本。 webpack 支持多種模塊化,將不同模塊的依賴關(guān)系構(gòu)建成依賴圖來進(jìn)行統(tǒng)一處理,當(dāng)構(gòu)建的項(xiàng)目越來越大時,需要處理的 JS 代碼也越

    2024年02月11日
    瀏覽(20)
  • 【大蝦送書第七期】深入淺出SSD:固態(tài)存儲核心技術(shù)、原理與實(shí)戰(zhàn)

    【大蝦送書第七期】深入淺出SSD:固態(tài)存儲核心技術(shù)、原理與實(shí)戰(zhàn)

    目錄 ??寫在前面? ??內(nèi)容簡介 ??作者簡介 ??名人推薦 ??文末福利 ???????博客主頁:大蝦好吃嗎的博客 ? ? ???專欄地址:免費(fèi)送書活動專欄地址 ????????近年來國家大力支持半導(dǎo)體行業(yè),鼓勵自主創(chuàng)新,中國SSD技術(shù)和產(chǎn)業(yè)良性發(fā)展,產(chǎn)業(yè)鏈在不斷完善,與

    2024年02月10日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包