最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java必踩的坑之方法中形參、實參傳遞

 更新時間:2022年03月29日 08:21:42   作者:Mr.Yushiwen  
這篇文章主要給大家介紹了關(guān)于Java必踩的坑之方法中形參、實參傳遞的相關(guān)資料,以及Java 形參和實參的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下

首先亮明Java中方法參數(shù)傳遞的規(guī)則,這兩點很重要:

  1. 如果實參是基本類型(包括包裝類型)或者String,則實參不會變(傳的是值);
  2. 如果實參是對象集合或者數(shù)組,則實參會改變(傳的是引用)。

上面這兩條比較簡單,筆者就不展開說了,這里只說一點,關(guān)于方法中引用的傳遞,很多人會踩坑,如下:

我們先以數(shù)組舉例,如下代碼,很簡單的幾行,大家猜一下會最終輸出的結(jié)果是什么樣子的呢?

public class PassByValueDemo {
    public static void main(String[] args) {
        int[] i = {0};
        new PassByValueDemo().Demo(i);
        // 這個地方還是0
        System.out.printf(Arrays.toString(i));
    }

    public void Demo(int[] i){
    	// 這個實參為數(shù)組,傳的是引用,其值會改變??? nonono,只是在這個方法中改變了,回到main方法棧中還是{0}。
        i = new int[]{1,2,3};
        System.out.println(Arrays.toString(i));
    }
}

根據(jù)第二條規(guī)則如果實參是對象集合或者數(shù)組,則實參會改變(傳的是引用),大家很容易想到,這個實參為數(shù)組,傳的是引用,其值會改變,那就大錯特錯了。這個只會在方法中短暫改變數(shù)組的值,回到main方法棧中還是{0}。
實際輸出如下:

[1, 2, 3]
[0]
Process finished with exit code 0

為什么會這樣呢?具體分析如下:

  1. 我們先看main方法中第一行操作int [] i ={0},這個操作會在內(nèi)存中開辟一個4字節(jié)大小的內(nèi)存空間,然后返回其該數(shù)組的首地址,我們假設(shè)該數(shù)組的首地址值為0x1111,那么此時i就指向了內(nèi)存中0x1111這么一個空間。內(nèi)存地址為0x1111的空間存儲了0;
  2. 繼續(xù)往下指看,調(diào)用Demo方法,此時會保存mian方法棧的狀態(tài),包括i在mian方法中指向的內(nèi)存空間,這里點很重要,很重要,重要,重要的事情說三遍。
  3. 在Demo方法中 new Int[] {1,2,3},這個操作會重新在內(nèi)存中開辟一個空間,然后返回該數(shù)組的首地址的值,我們把這個地址值假設(shè)為0x2222,內(nèi)存為0x2222存儲了1,2,3;此時i的值指向了0x2222;那么這個時候輸出i,當(dāng)然會打印1,2,3;
  4. 執(zhí)行完了Demo方法,我們回到main方法中,此時從虛擬機(jī)棧中恢復(fù)剛才進(jìn)入Demo方法前保存的棧信息,在進(jìn)入Demo方法前i是指向0x1111這么一個地址空間,進(jìn)入前已經(jīng)保存了棧中的局部變量表中(局部變量表可參考筆者該篇博文:點擊我),我們現(xiàn)在取出來,那么i的指向的就是0x1111,而不是0x2222,此時打印的是0x1111指向的值,也就是0;

雖然我們不能改變引用地址,但是可以改變引用指向的地址空間里的值,如下:

public class PassByValueDemo {
    public static void main(String[] args) {
        int[] i = {0};
        new PassByValueDemo().Demo(i);
        System.out.printf(Arrays.toString(i));
    }

    public void Demo(int[] i){
        i[0] = 1;
        System.out.println(Arrays.toString(i));
    }
}

輸出結(jié)果:

[1]
[1]
Process finished with exit code 0

熟悉C或C++的同學(xué)可以類比int *const(允許更改存儲在地址中的值),而不是int const*(允許指針指向其他地址)。

Java 形參和實參的區(qū)別:

形參 :就是形式參數(shù),用于定義方法的時候使用的參數(shù),是用來接收調(diào)用者傳遞的參數(shù)的。 形參只有在方法被調(diào)用的時候,虛擬機(jī)才會分配內(nèi)存單元,在方法調(diào)用結(jié)束之后便會釋放所分配的內(nèi)存單元。 因此,形參只在方法內(nèi)部有效,所以針對引用對象的改動也無法影響到方法外。

實參 :就是實際參數(shù),用于調(diào)用時傳遞給方法的參數(shù)。實參在傳遞給別的方法之前是要被預(yù)先賦值的。 在本例中 swap 方法 的numa, numb 就是形參,傳遞給 swap 方法的 a,b 就是實參

注意:在值傳遞調(diào)用過程中,只能把實參傳遞給形參,而不能把形參的值反向作用到實參上。在函數(shù)調(diào)用過程中,形參的值發(fā)生改變,而實參的值不會發(fā)生改變。而在引用傳遞調(diào)用的機(jī)制中,實際上是將實參引用的地址傳遞給了形參,所以任何發(fā)生在形參上的改變也會發(fā)生在實參變量上。

總結(jié)

到此這篇關(guān)于Java必踩坑之方法中形參、實參傳遞的文章就介紹到這了,更多相關(guān)Java形參、實參傳遞內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

乐陵市| 吉安县| 安远县| 麟游县| 巩留县| 长乐市| 包头市| 霸州市| 贵德县| 朔州市| 宜兰县| 赤水市| 余江县| 晋州市| 平安县| 涿州市| 太仓市| 梅河口市| 司法| 临桂县| 虹口区| 收藏| 延川县| 仙桃市| 开平市| 广德县| 高雄县| 云安县| 丽水市| 永登县| 上虞市| 平武县| 伊通| 安庆市| 田林县| 科技| 汶上县| 凌云县| 巍山| 沾化县| 久治县|