欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

java是值傳遞嗎

這篇文章主要講解了“java是值傳遞嗎”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“java是值傳遞嗎”吧!

創(chuàng)新互聯(lián)建站長期為千余家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為彭州企業(yè)提供專業(yè)的網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì),彭州網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。

java是值傳遞;值傳遞是指在調(diào)用方法時(shí)將實(shí)際參數(shù)拷貝一份傳遞到方法中,這樣在方法中如果對參數(shù)進(jìn)行修改,將不會(huì)影響到實(shí)際參數(shù);當(dāng)傳的是基本類型時(shí),傳的是值的拷貝,對拷貝變量的修改不影響原變量;當(dāng)傳的是引用類型時(shí),傳的是引用地址的拷貝,但是拷貝的地址和真實(shí)地址指向的都是同一個(gè)真實(shí)數(shù)據(jù),因此可以修改原變量中的值。

本教程操作環(huán)境:windows10系統(tǒng)、DELL G3電腦。

java是值傳遞還是引用傳遞

Java是值傳遞。

當(dāng)傳的是基本類型時(shí),傳的是值的拷貝,對拷貝變量的修改不影響原變量;當(dāng)傳的是引用類型時(shí),傳的是引用地址的拷貝,但是拷貝的地址和真實(shí)地址指向的都是同一個(gè)真實(shí)數(shù)據(jù),因此可以修改原變量中的值;當(dāng)傳的是String類型時(shí),雖然拷貝的也是引用地址,指向的是同一個(gè)數(shù)據(jù),但是String的值不能被修改,因此無法修改原變量中的值。

首先來解釋一下什么是引用傳遞,什么是值傳遞。

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

  • 值傳遞(pass by value)是指在調(diào)用方法時(shí)將實(shí)際參數(shù)拷貝一份傳遞到方法中,這樣在方法中如果對參數(shù)進(jìn)行修改,將不會(huì)影響到實(shí)際參數(shù)。

那在Java中到底是引用傳遞還是值傳遞呢?其實(shí)這個(gè)問題也一直是爭論不斷,而且官方也沒給個(gè)確切答案。但是就我個(gè)人理解,Java是值轉(zhuǎn)遞。

我們先來看一個(gè)簡單的例子:

public void test() {
    int a = 1;
    change(a);
    System.out.println("a的值:" + a);
}
private void change(int a) {
    a = a + 1;
}
// 輸出
a的值:1

在test()方法中定義了一個(gè)基本類型的變量a,然后調(diào)用change()方法試圖改變這個(gè)變量,最后輸出的還是原來的值。

首先我們要清楚,一個(gè)方法中的局部變量是存在棧中的,如果是基本類型的變量則直接存的是這個(gè)變量的值,如果是引用類型的變量則存的是值的地址,指向堆中具體的值。

上面的例子中,調(diào)用change()方法傳遞的a,其實(shí)是a變量的拷貝,不是真正的a,在change()方法中改變的是拷貝,對真正的a是沒有影響的。

這么一看,Java確實(shí)是值傳遞,但是我們再看下面這個(gè)例子,你就會(huì)糾結(jié)了

public void test() {
   User user = new User();
   user.setAge(18);
   change(user);
   System.out.println("年齡:" + user.getAge());
}
private void change(User user) {
   user.setAge(19);
}
// 輸出
年齡:19

看,對象里的屬性被改變了,不是值傳遞嗎,應(yīng)該不會(huì)改變啊,這時(shí)候就有人總結(jié)了,當(dāng)傳遞值是基本類型時(shí)是值傳遞、當(dāng)傳的是引用類型時(shí)是引用傳遞。真的是這樣嗎?

分析這個(gè)問題,我們需要知道變量在jvm中是怎么存儲(chǔ)的。

首先看基本類型,這個(gè)很簡單,變量在棧中直接存的是值,傳到change()方法的是這個(gè)變量的拷貝,因此對拷貝的變量修改不會(huì)影響原變量的值。

接著看引用類型,變量在棧中存儲(chǔ)的是引用地址,這個(gè)地址指向堆中具體的值,如下圖:

java是值傳遞嗎

當(dāng)調(diào)用change()方法傳入變量時(shí),也是拷貝變量,但是這里的拷貝只是棧中的引用地址,并不會(huì)拷貝堆中的數(shù)據(jù),因此會(huì)變成下圖這樣:

java是值傳遞嗎

雖然變量是拷貝,但是指向的地址是同一個(gè),因此對變量中的數(shù)據(jù)修改時(shí),還是會(huì)影響到原來真實(shí)的變量,但是,如果我們修改的是變量在棧中的地址,則不會(huì)影響原變量,例如下面這段代碼:

public void test() {
   User user = new User();
   user.setAge(18);
   change(user);
   System.out.println("年齡:" + user.getAge());
}
private void change(User user) {
   user = new User();
   user.setAge(19);
}
// 輸出
年齡:18

這種是修改變量在棧中的地址,則不會(huì)影響原變量。

說到這里,大家差不多懂了,但是回頭看最開始的那個(gè)問題,傳入String類型的變量,String是引用類型,按道理,原變量是會(huì)被改變的呀,結(jié)果怎么是不變呢?

String變量比較特殊,我們看String的源碼可以知道,String的值是通過內(nèi)部的char[]數(shù)組來維護(hù)的,但是這個(gè)數(shù)據(jù)定義的是final類型的,因此,String的值是不可變的。我們平時(shí)修改String的值,其實(shí)是重新new了一個(gè)String對象,例如下面這段代碼:

String a = "hello";
a = "world";

這段代碼里,其實(shí)a變量并沒有被修改成world,只是重新new了一個(gè)String對象,這個(gè)對象的值是world,并把這個(gè)對象的引用地址賦給了a,原來的hello還是在堆中,只是這個(gè)值沒有被引用,過段時(shí)間會(huì)被gc垃圾回收。

String變量傳值在內(nèi)存中的變化如下圖:

java是值傳遞嗎

String拷貝的是變量地址,但是它改變不了原String的值,因?yàn)镾tring是不可變的,所以在change()方法中是重新new了一個(gè)String對象,改變的是新對象的值,原變量是沒有影響的。

感謝各位的閱讀,以上就是“java是值傳遞嗎”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對java是值傳遞嗎這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!

當(dāng)前文章:java是值傳遞嗎
瀏覽地址:http://chinadenli.net/article40/goppho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航Google、App設(shè)計(jì)云服務(wù)器、軟件開發(fā)、ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

營銷型網(wǎng)站建設(shè)