日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

java面试题解惑_JAVA面试题解惑系列(五)——传了值还是传了引用?

發(fā)布時(shí)間:2024/7/19 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java面试题解惑_JAVA面试题解惑系列(五)——传了值还是传了引用? 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

作者:臧圩人(zangweiren)

網(wǎng)址:http://zangweiren.javaeye.com

>>>轉(zhuǎn)載請(qǐng)注明出處! < < <

JAVA中的傳遞都是值傳遞嗎?有沒有引用傳遞呢?

在回答這兩個(gè)問(wèn)題前,讓我們首先來(lái)看一段代碼:

Java代碼

public final class ParamTest {

// 初始值為0

protected int num = 0;

// 為方法參數(shù)重新賦值

public void change(int i) {

i = 5;

}

// 為方法參數(shù)重新賦值

public void change(ParamTest t) {

ParamTest tmp = new ParamTest();

tmp.num = 9;

t = tmp;

}

// 改變方法參數(shù)的值

public void add(int i) {

i += 10;

}

// 改變方法參數(shù)屬性的值

public void add(ParamTest pt) {

pt.num += 20;

}

public static void main(String[] args) {

ParamTest t = new ParamTest();

// 為基本類型參數(shù)重新賦值

t.change(t.num);

System.out.println(t.num);

// 為引用型參數(shù)重新賦值

t.change(t);

System.out.println(t.num);

// 改變基本類型參數(shù)的值

t.add(t.num);

System.out.println(t.num);

// 改變引用類型參數(shù)所指向?qū)ο蟮膶傩灾?/p>

t.add(t);

System.out.println(t.num);

}

}

這段代碼的運(yùn)行結(jié)果如下:

0

0

0

20

從上面這個(gè)直觀的結(jié)果中我們很容易得出如下結(jié)論:

對(duì)于基本類型,在方法體內(nèi)對(duì)方法參數(shù)進(jìn)行重新賦值,并不會(huì)改變?cè)凶兞康闹怠?/p>

對(duì)于引用類型,在方法體內(nèi)對(duì)方法參數(shù)進(jìn)行重新賦予引用,并不會(huì)改變?cè)凶兞克钟械囊谩?/p>

方法體內(nèi)對(duì)參數(shù)進(jìn)行運(yùn)算,不影響原有變量的值。

方法體內(nèi)對(duì)參數(shù)所指向?qū)ο蟮膶傩赃M(jìn)行運(yùn)算,將改變?cè)凶兞克赶驅(qū)ο蟮膶傩灾怠?/p>

上面總結(jié)出來(lái)的不過(guò)是我們所看到的表面現(xiàn)象。那么,為什么會(huì)出現(xiàn)這樣的現(xiàn)象呢?這就要說(shuō)到值傳遞和引用傳遞的概念了。這個(gè)問(wèn)題向來(lái)是頗有爭(zhēng)議的。

大家都知道,在JAVA中變量有以下兩種:

基本類型變量,包括char、byte、short、int、long、float、double、boolean。

引用類型變量,包括類、接口、數(shù)組(基本類型數(shù)組和對(duì)象數(shù)組)。

當(dāng)基本類型的變量被當(dāng)作參數(shù)傳遞給方法時(shí),JAVA虛擬機(jī)所做的工作是把這個(gè)值拷貝了一份,然后把拷貝后的值傳遞到了方法的內(nèi)部。因此在上面的例子中,在調(diào)用

Java代碼

// 為方法參數(shù)重新賦值

public void change(int i) {

i = 5;

}

方法的情況下,變量i和ParamTest型對(duì)象t的屬性num具有相同的值,卻是兩個(gè)不同變量。變量i是由JAVA虛擬機(jī)創(chuàng)建的作用域在change(int i)方法內(nèi)的局部變量,在這個(gè)方法執(zhí)行完畢后,它的生命周期就結(jié)束了。在JAVA虛擬機(jī)中,它們是以類似如下的方式存儲(chǔ)的:

[img]http://zangweiren.javaeye.com/upload/picture/pic/17754/bf858157-cd1b-3e9e-9fd1-374906bfd90f.jpg[/img]

很明顯,在基本類型被作為參數(shù)傳遞給方式時(shí),是值傳遞,在整個(gè)過(guò)程中根本沒有牽扯到引用這個(gè)概念。這也是大家所公認(rèn)的。對(duì)于布爾型變量當(dāng)然也是如此,請(qǐng)看下面的例子:

Java代碼

public final class BooleanTest {

// 布爾型值

boolean bool = true;

// 為布爾型參數(shù)重新賦值

public void change(boolean b) {

b = false;

}

// 對(duì)布爾型參數(shù)進(jìn)行運(yùn)算

public void calculate(boolean b) {

b &= false;

// 為了方便對(duì)比,將運(yùn)算結(jié)果輸出

System.out.println("運(yùn)算后的值:" + b);

}

public static void main(String[] args) {

BooleanTest t = new BooleanTest();

// 為布爾型參數(shù)重新賦值

t.change(t.bool);

System.out.println(t.bool);

// 改變布爾型參數(shù)的值

t.calculate(t.bool);

System.out.println(t.bool);

}

}

輸出結(jié)果如下:

true

運(yùn)算后的值:false

true

那么當(dāng)引用型變量被當(dāng)作參數(shù)傳遞給方法時(shí)JAVA虛擬機(jī)又是怎樣處理的呢?同樣,它會(huì)拷貝一份這個(gè)變量所持有的引用,然后把它傳遞給JAVA虛擬機(jī)為方法創(chuàng)建的局部變量,從而這兩個(gè)變量指向了同一個(gè)對(duì)象。在篇首所舉的示例中,ParamTest類型變量t和局部變量pt在JAVA虛擬機(jī)中是以如下的方式存儲(chǔ)的:

[img]http://zangweiren.javaeye.com/upload/picture/pic/17756/3c3c237f-bd06-3e7a-a0d9-a2317754b560.jpg[/img]

有一種說(shuō)法是當(dāng)一個(gè)對(duì)象或引用類型變量被當(dāng)作參數(shù)傳遞時(shí),也是值傳遞,這個(gè)值就是對(duì)象的引用,因此JAVA中只有值傳遞,沒有引用傳遞。這種說(shuō)法顯然是混淆了值和引用的概念。

值傳遞中的值指的是基本類型的數(shù)值,即使對(duì)于布爾型,雖然它的表現(xiàn)形式為true和false,但是在棧中,它仍然是以數(shù)值形式保存的,即0表示true,其它數(shù)值表示false。而引用是我們用來(lái)操作對(duì)象的工具,它包含了對(duì)象在堆中保存地址的信息。即使在被作為參數(shù)傳遞給方法時(shí),實(shí)際上傳遞的是它的拷貝,但那仍是引用。

最后我們得出如下的結(jié)論:

基本類型和基本類型變量被當(dāng)作參數(shù)傳遞給方法時(shí),是值傳遞。在方法實(shí)體中,無(wú)法給原變量重新賦值,也無(wú)法改變它的值。

對(duì)象和引用型變量被當(dāng)作參數(shù)傳遞給方法時(shí),是引用傳遞。在方法實(shí)體中,無(wú)法給原變量重新賦值,但是可以改變它所指向?qū)ο蟮膶傩浴?/p>

總結(jié)

以上是生活随笔為你收集整理的java面试题解惑_JAVA面试题解惑系列(五)——传了值还是传了引用?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。