亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

關(guān)于Java引用傳遞的一個(gè)困惑?
ringa_lee
ringa_lee 2017-04-18 10:47:30
0
6
610
    public static void swapEqual(int[] a,int[] b){
        int[] temp=new int[b.length];
        temp=b;
        b=a;
        a=temp;
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] c={1,2};
        int[] d={3,4};
        swapEqual(c,d);
        System.out.println(c[1]);
    }

為什么打印出來的C[1]還是原來的2啊,為什么沒有交換。數(shù)組的=不就是復(fù)制引用嗎?通過函數(shù)可以把a(bǔ),b的引用交換,這樣不就是把內(nèi)容交換了嗎?
干嘛非要這樣寫?
public static void swap(int[] a,int[] b){
    int[] temp=new int[b.length];
    for(int i=0;i<b.length;i++){
        temp[i]=b[i];
    }
    for(int i=0;i<b.length;i++){
        b[i]=a[i];
    }
    for(int i=0;i<b.length;i++){
        a[i]=temp[i];
    }
}

這樣子我試了一下,就可以達(dá)到交換的目的了
好困惑啊,求解!!

ringa_lee
ringa_lee

ringa_lee

全部回覆(6)
PHPzhong

swapEqual(int[] a,int[] b)中:
一開始:
a --> {1,2}(地址1)
b --> {3,4}(地址2)
經(jīng)過你的程式碼處理(a,b指向的位址交換了):
b --> {1,2}(位址1)
a --> {3,4}(位址2)
但是不會(huì)對c,d造成影響,c,d依舊是:
c --> {1,2}(位址1)
d --> {3,4}(位址2)

//=================================

swap(int[] a,int[] b)中:
一開始:
a --> {1,2}(地址1)
b --> {3,4}(地址2)
經(jīng)過你的代碼處理(地址1,2中的值交換了):
a --> {3,4}(地址1)
b --> {1,2}(地址2)
雖然不會(huì)對c, d指向的位址造成影響,但原本位址下的值已經(jīng)改變了:
c --> {3,4}(位址1)
d --> {1,2}(位址2)

//=======================================

我的理解是這樣,寫完發(fā)現(xiàn)與@lianera的表述是同一個(gè)意思,就當(dāng)是補(bǔ)充說明了。

//=======================================

你可以試著用return把swapEqual(int[] a,int[] b)交換後的a,b的值賦給c,d,看看結(jié)果。

Ty80

swapEqual函數(shù)裡面,只是改變了形參a、b的引用,並沒有改變實(shí)參c、d的引用。
而swap裡面,改變的c、d對應(yīng)的區(qū)域的值了。
補(bǔ)充一下,Java裡面數(shù)組也是對象,所以a、b、c、d都是引用。

伊謝爾倫

Java 裡的引用和 C++ 裡的引用概念有點(diǎn)不一樣,Java 裡的引用相當(dāng)於 C++ 中的指針,所以你直接對形參賦值是改變不了實(shí)參的。

Peter_Zhu

看看這個(gè)回答。 https://www.zhihu.com/questio...

阿神

Java的引用(包括基本型別,物件引用型別)在宣告、方法呼叫等時(shí)候都會(huì)產(chǎn)生新的引用,複製等號右邊的引用。分為下面3種情況:

  1. 基本類型代表的值儲(chǔ)存在引用裡面,引用中專門有個(gè)區(qū)域儲(chǔ)存這個(gè)值,所以在複製的時(shí)候,值也同時(shí)被複製了。

  2. 引用型這個(gè)區(qū)域儲(chǔ)存的是物件在堆記憶體中的記憶體位址,引用複製的時(shí)候,指向的記憶體位址卻是同一份,所以不會(huì)涉及值(也就是物件)的複製

  3. 數(shù)組裡面都是儲(chǔ)存的引用(包括基本型,物件引用型別)


引用資訊:在Java中,引用資料型別佔(zhàn)記憶體嗎?

要弄清楚這個(gè)問題,首先要清楚,在JAVA中有四類八種基本類型,除了基本類型,全都是引用類型。例如你寫 int i = 1; 那麼它在記憶體裡的分配是這樣的:記憶體裡分配了一塊空間,這塊空間的名字是i,裡面的內(nèi)容是1.

當(dāng)你使用i的時(shí)候就可以存取這塊空間裡的內(nèi)容。而引用型別不同,引用型別在記憶體中佔(zhàn)兩塊記憶體。例如:你寫String s;或String s = null;這時(shí)候在記憶體裡分配一塊記憶體。這塊記憶體裝的是空值null,也就是什麼都沒有裝。因?yàn)檫€沒有進(jìn)行初始化。上個(gè)圖:

至於具體這個(gè)s分配在哪,要看他被聲明的位置。如果s被宣告為局部變量,那s就在堆疊空間。如果不是局部變量,那就不在堆疊上分配。而當(dāng)你用s指向一個(gè)String類型的物件的時(shí)候,就改變了。也就是接著寫s = new String("zhihu");的時(shí)候。上個(gè)圖:

原來的s裡面就會(huì)有一個(gè)值,根據(jù)s這塊空間裡的這個(gè)值就可以找到在堆上找到另一塊記憶體。所有new出來的東西都在堆記憶體裡。堆上的這塊記憶體裡對String的屬性進(jìn)行分配。堆記憶體是動(dòng)態(tài)分配記憶體的。所以既然是分配在堆上,其實(shí)也說明了new出來的物件佔(zhàn)多大記憶體並不能確定,只能在運(yùn)作期間才能分配,才能明白這個(gè)物件分配多大。 而且佔(zhàn)用記憶體不能確定的原因還有一個(gè)就是,方法在執(zhí)行的時(shí)候才分配記憶體。如果沒有呼叫方法,那方法只是一堆程式碼而已,不佔(zhàn)用記憶體。

伊謝爾倫

謝謝大家的回答,都講的挺好的。我也明白了

最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板