Java只有值傳遞(Java值傳遞仍是引用傳遞?)

 

轉載請註明原文地址:http://www.javashuo.com/article/p-fdtefmqy-dr.htmlhtml

 

一:區分Java數據類型、變量類型

    Java數據類型分兩種:基本數據類型、引用類型。數組

    8種基本數據類型(4整,2浮,1符,1布):byte(最小的數據類型)、short(短整型)、int(整型)、long(長整型);float(浮點型)、double(雙精度浮點型);char(字符型);boolean(布爾型)。函數

    引用類型類型:引用數據類型很是多,如:類、 接口類型、 數組類型、 枚舉類型、 註解類型、 字符串型。「簡單來講,全部的非基本數據類型都是引用數據類型。spa

 

    變量類型:相應地,根據變量要存放的數據類型,也區分爲:基本類型變量、引用類型變量。htm

 

    基本類型和引用類型的區分,體如今其對應變量所存儲的內容不一樣:對象

    基本類型變量:變量存放的就是一個單純的值。blog

    引用類型變量:變量存放的是一個內存地址(引用),該地址指向內存中另外一片地址,那片地址纔是真正存放對象值的地方。接口

 

二:Java傳參時的操做

    咱們在調用函數時,會將某些變量做爲函數參數傳遞進去,調用方法時發生了什麼?內存

    這裏涉及到形參和實參的概念:字符串

    一、在函數定義時所使用的參數,就是形參

        定義函數時,函數參數只是做爲一個變量、符號,體如今代碼邏輯中,它沒有具體的值。

    二、在調用函數時,將值傳給參數後,就是實參

        在調用函數時,參數有了具體的值,變得有實際意義,此時稱之爲實參。

 

    所以,參數傳遞的實質:就是  爲函數形參賦值,使之變成實參數  的過程,也就是說:函數邏輯中所操做的並非咱們傳進去的變量自己,而是copy了變量值的實參

 

    根據傳遞的數據類型以及函數中對參數的使用操做不一樣,大體能夠分爲4種場景:

    一、基本數據類型傳遞

    因爲基本類型變量中存放的就是基本類型值,所以傳遞基本類型變量做爲參數時,就是將變量的值,copy給了函數的實參。

    所以,在函數中改變實參的值,不會影響函數外部的變量值。

 

    二、immutable的引用類型變量傳遞

    對於String,以及Integer、Double等幾個基本類型包裝類,它們的值是不可變的,也就是說:存放包裝類類型的變量值,指向了一個對象地址,而這個變量不能再指向其餘地址或存放別的值。

    在immutable類型變量的傳遞過程當中:會將變量值(引用地址)所指向的內容copy一份,並將複製後的空間的地址傳遞給函數做爲實參。也就是說:傳遞給函數的變量所指向的空間,與函數實參所指向的空間是不一樣的,只不過各自指向的空間中的內容同樣而已。

    所以,函數中操做實參,不會影響到函數外部的變量值。

 

    三、變量值可變的引用類型變量傳遞,並在函數中使用該引用去改變內容

    對於class、array等普通引用類型,其變量值是一個地址,指向了這些對象真正存放的空間。「可變」的意思是:存放這些數據類型的變量,它能夠所存儲的地址,指向別的存儲空間。

    在這種類型的變量傳遞給參數的時候:會將變量值(引用地址)copy一份,傳遞給函數做爲實參。也就是說:傳遞給函數的變量所指向的空間,與函數實參所指向的空間是相同

    所以,在函數中經過實參去改變對象的內容,會影響到函數外部變量所指向的對象的內容,由於它們都指向同一個對象。

 

    四、變量值可變的引用類型變量傳遞,但函數中爲實參賦新值

    與第3點不一樣,這種場景下,實參在函數中被更改了值,指向了新的地址。

    所以,在後續操做中經過實參去改變對象的內容時,不會影響到函數外部變量所指向的內容,由於它們指向了不一樣對象。

 

 

三:結論——Java只有值傳遞

    經過上文中關於「參數傳遞的實質」論述能夠得知:函數調用時,不管值類型變量仍是引用類型變量,都是將變量所存儲的值copy給了函數的實參,區別在於基本類型變量的值就是類型值自己,而引用類型變量的值是一個地址。

    也就是說:Java函數調用時,都是值傳遞。

相關文章
相關標籤/搜索