欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

在Java中按值調(diào)用和按引用調(diào)用

 更新時(shí)間:2022年04月27日 11:03:53   作者:?sofia  
這篇文章主要介紹了Java中的按值調(diào)用和按引用調(diào)用,一種是按值調(diào)用,另一種是按引用調(diào)用,這兩種方式通常根據(jù)作為輸入或參數(shù)傳遞給它們的值的類型來區(qū)分,下文相關(guān)的更多詳細(xì)資料感興趣的小伙伴可以參考一下

一、為什么按值調(diào)用和按引用調(diào)用?

方法或函數(shù)可以通過兩種方式調(diào)用。一種是按值調(diào)用,另一種是按引用調(diào)用,這兩種方式通常根據(jù)作為輸入或參數(shù)傳遞給它們的值的類型來區(qū)分。

在我們開始之前,讓我澄清一件事,在Java中,只有按值調(diào)用(值傳遞),沒有按引用調(diào)用。

二、按值調(diào)用

按值調(diào)用是一種方法,通過復(fù)制給定變量(或常量或任何保存數(shù)據(jù)的對象)的實(shí)際值,將參數(shù)傳遞給函數(shù)

這意味著當(dāng)我們調(diào)用一個(gè)傳遞參數(shù)值的方法時(shí),這個(gè)參數(shù)值會(huì)被復(fù)制到內(nèi)存的一部分(取決于類型),值的副本會(huì)被傳遞給調(diào)用方法的參數(shù)。

在Java中,只有按值調(diào)用,沒有按引用調(diào)用。

三、引用調(diào)用

通過引用調(diào)用是一種將值的引用(即地址)傳遞給方法的方法。

這意味著,當(dāng)我們通過將引用的副本(即地址)傳遞給該方法的值而不是值本身的副本來調(diào)用該方法時(shí),調(diào)用方法具有該值的引用(即地址)。

當(dāng)調(diào)用方法更改值的引用時(shí),原始引用也會(huì)更改。

四、為什么Java中只有按值調(diào)用,沒有按引用調(diào)用?

根據(jù)定義,引用調(diào)用是我們傳遞該變量的引用(即地址)的地方。要做到這一點(diǎn),我們需要首先存儲(chǔ)地址,這將需要一個(gè)指針(在C中,其傳遞為*variableName)。正如我們所知,在java中,我們沒有指針,因此不可能傳遞引用(即地址)并執(zhí)行逐引用調(diào)用。

Java不支持指針,這就是為什么Java不支持引用調(diào)用。但是C/C++支持指針,因此這些語言支持引用調(diào)用。

您可能會(huì)問,為什么Java不支持指針?好吧,這是另一個(gè)有爭議的話題,我們可以在其他文章中討論,直到簽出這個(gè)stackoverflow頁面,可以參考,這讓您對它有了一些了解。

但是,我們?nèi)匀豢梢越柚鷮ο笮袨樵贘ava中實(shí)現(xiàn)引用調(diào)用。

五、Java中的引用調(diào)用,但如何調(diào)用?

Java總是使用按值調(diào)用。這意味著該方法獲取所有參數(shù)值的副本,并且該方法不能修改傳遞的變量的內(nèi)容。Java使用兩種方法參數(shù):

  • Java基本類型
  • Java對象引用

它看起來非常簡單明了,就像將基本類型傳遞給方法一樣。但在將對象傳遞給該方法時(shí),這是非常引人注目的。當(dāng)一個(gè)對象被傳遞給一個(gè)方法時(shí),該方法會(huì)獲得對象引用的一個(gè)副本,而原始副本和正式副本都引用同一個(gè)對象,因此在調(diào)用方法中,可以更改對象參數(shù)的狀態(tài)。

讓我們通過一個(gè)例子來詳細(xì)了解上述兩個(gè)方法參數(shù)。

將Java基本數(shù)據(jù)類型作為參數(shù)傳遞給方法

對于原始數(shù)據(jù)類型參數(shù),原始值不變。讓我們舉一個(gè)簡單的例子:

public class PrimitiveDataInAction {
  public static void main(String[] args) {
    int someValue = 50;
    System.out.println("Before method call :: " + someValue);
    modified(someValue);
    System.out.println("After method call :: " + someValue);
  }
  public static void modified(int someValue) {
    System.out.println("exiting name :: " + someValue);
    // modifying the parameter
    someValue = 15;
    System.out.println("modified name :: " + someValue);
  }
}

輸出:

Before method call :: 50
exiting name :: 50
modified name :: 15
After method call :: 50

Process finished with exit code 0

當(dāng)您將原始數(shù)據(jù)類型變量傳遞給一個(gè)方法時(shí),它會(huì)為該方法創(chuàng)建一個(gè)本地副本,并執(zhí)行方法中提到的任何操作&一旦這個(gè)變量從這個(gè)方法中出來,方法本地副本就會(huì)從內(nèi)存中刪除

&調(diào)用該變量之前加載的前一個(gè)值。

六、Java對象引用

對于Java對象引用類型的按值調(diào)用,會(huì)更改原始值。

讓我們舉一個(gè)簡單的例子:

class JavaObjectReferencesInAction {
  public static void main(String[] args) {
    List <String> listOfString = new ArrayList < > ();
    listOfString.add("Mahesh");
    System.out.println("Before modified :: " + listOfString);
    modified(listOfString);
    System.out.println("After modified :: " + listOfString);
  }
  public static void modified(List < String > listOfString) {
    // modifying the string
    listOfString.add("Imran");
  }
}

輸出:

Before modified :: [Mahesh]
exiting listOfString :: [Mahesh]
modified listOfString :: [Mahesh, Imran]
After modified :: [Mahesh, Imran]

Process finished with exit code 0

讓我們看看它是如何工作的。

在上面的示例中,我們創(chuàng)建了一個(gè)ArrayList對象,并在其中添加了一個(gè)字符串值Mahesh?,F(xiàn)在列表中的數(shù)據(jù)是一個(gè)字符串,值為Mahesh。

在下一行中,我們調(diào)用了modified方法,該方法獲取一個(gè)列表,并向同一給定列表中添加一個(gè)字符串Imran

但是當(dāng)我們調(diào)用這個(gè)修改過的方法時(shí),Java對象引用代替了值。它傳遞list的引用,list只是list的實(shí)際對象

這也會(huì)導(dǎo)致修改原始列表。

七、結(jié)論

我們詳細(xì)討論了一個(gè)棘手的面試問題,即Java中的按值調(diào)用和按引用調(diào)用。對于初學(xué)者來說,這可能需要消化很多東西,但相信我,一旦你開始玩它,它就會(huì)在你的腦海中清晰地浮現(xiàn)出來。

相關(guān)文章

  • Java中的迭代器和foreach原理

    Java中的迭代器和foreach原理

    這篇文章主要介紹了Java中的迭代器和foreach原理,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-09-09
  • POI XSSFSheet shiftRows bug問題解決

    POI XSSFSheet shiftRows bug問題解決

    這篇文章主要介紹了POI XSSFSheet shiftRows bug問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • 基于Spring BeanUtils的copyProperties方法使用及注意事項(xiàng)

    基于Spring BeanUtils的copyProperties方法使用及注意事項(xiàng)

    這篇文章主要介紹了基于Spring BeanUtils的copyProperties方法使用及注意事項(xiàng),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java中Stream流中map和forEach的區(qū)別詳解

    Java中Stream流中map和forEach的區(qū)別詳解

    本文主要介紹了Java中Stream流中map和forEach的區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • java 讀取excel內(nèi)容具體代碼

    java 讀取excel內(nèi)容具體代碼

    這篇文章介紹了java 讀取excel內(nèi)容具體代碼,有需要的朋友可以參考一下
    2013-10-10
  • Java?hibernate延遲加載get和load的區(qū)別

    Java?hibernate延遲加載get和load的區(qū)別

    這篇文章主要介紹了Java?hibernate延遲加載get和load的區(qū)別,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • Java File類常用方法與文件過濾器詳解

    Java File類常用方法與文件過濾器詳解

    Java File類以抽象的方式代表文件名和目錄路徑名。該類主要用于文件和目錄的創(chuàng)建、文件的查找和文件的刪除等。File對象代表磁盤中實(shí)際存在的文件和目錄。本篇文章我們來講解File類的常用方法與文件過濾器
    2022-04-04
  • Java中EnumSet代替位域代碼詳解

    Java中EnumSet代替位域代碼詳解

    這篇文章主要介紹了Java中EnumSet代替位域代碼詳解,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • SSM+微信小程序?qū)崿F(xiàn)物業(yè)管理系統(tǒng)及實(shí)例代碼

    SSM+微信小程序?qū)崿F(xiàn)物業(yè)管理系統(tǒng)及實(shí)例代碼

    這篇文章主要介紹了SSM+微信小程序?qū)崿F(xiàn)物業(yè)管理系統(tǒng),ssm微信小程序物業(yè)管理系統(tǒng),有網(wǎng)站后臺(tái)管理系統(tǒng),本文通過實(shí)例代碼給大家展示系統(tǒng)的功能,需要的朋友可以參考下
    2022-02-02
  • SpringBoot異步任務(wù)實(shí)現(xiàn)下單校驗(yàn)庫存的項(xiàng)目實(shí)踐

    SpringBoot異步任務(wù)實(shí)現(xiàn)下單校驗(yàn)庫存的項(xiàng)目實(shí)踐

    在開發(fā)中,異步任務(wù)應(yīng)用的場景非常的廣泛,本文主要介紹了SpringBoot異步任務(wù)實(shí)現(xiàn)下單校驗(yàn)庫存的項(xiàng)目實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09

最新評論