相信有些同窗跟我同樣,曾經對這個問題很疑惑。在網上也看了一些別人說的觀點,評論不一。有說有值傳遞和引用傳遞兩種,也有說只有值傳遞的,這裏只說下我的看法html
先看一個例子ide
public class Test1 { public static void main(String[] args) { int a = 10; changeNum(a); System.out.println("main a=" + a); } static void changeNum(int a) { a = 100; System.out.println("changeNum a=" + a); } }
結果:函數
changeNum a=100
main a=10this
說明對於基本的數值類型其實傳遞的是一份數值的拷貝,傳入函數以後跟原來的值就沒有關係了,在函數中改變這個數的值也不會影響到原來的值。spa
再看一個例子3d
public class P { String name = "P"; public P(String name) { this.name = name; } @Override public String toString() { return name; } } public class Test { static P p1 = new P("p1"); public static void main(String[] args) { P p = new P("P");
System.out.println("before change p:" + p.toString); changeObj(p); System.out.println("after change p:" + p.toString()); } static void changeObj(P p) { p = new P("pp"); System.out.println("change p:" + p.toString()); //p = p1; //System.out.println(p.toString()); } }
這個例子中的運行結果會是什麼呢?code
在這個例子中傳入的是一個對象類型的數據。htm
咱們先來猜測一下:若是傳入的是一個對象的引用,在函數中改變了這個引用所指向的對象,那麼外部的引用"p"應該是指向了新建立的P("pp")的對象纔對對象
因此猜測的結果是:blog
before change p:P
change p:pp
after change p:pp
那讓咱們來實際運行一下看看結果,實際的結果是:
before change p:P
change p:pp
after change p:P
想猜測的不同!!!
這就讓咱們很疑惑了,爲何函數沒有改變引用所指向對象呢?
實際上是這樣的,首先要理解「=」賦值操做的意義,
對於基本類型來講「=」賦值操做是直接改變內存地址上的值,
而對引用類型來講「=」賦值實際上是改變引用變量所指向的內存地址。
賦值操做後
引用的賦值並無對原來的對象形成影響,"hello"對象仍然是存在的,只是str又指向了新的"world"對象
理解了賦值操做後,如今來講下函數的參數傳遞
函數的參數實際上就是函數內部的一個局部變量,從外部傳值給這個參數實際上就是一個賦值的過程。
來看看第一個例子,傳一個定義一個int類型名稱爲a的形式參數,其實徹底能夠把名稱改成b
而後把外部變量a的值傳遞給函數的變量,就是賦值。基本類型的賦值就是把外部a變量的10賦值給函數變量a,因此這實際上是兩個變量,二者之間沒有任何關係,
因此對函數內部變量的改變也不會對外部的變量形成影響。
再來講下引用類型的傳遞,實際上是一個道理。
在傳遞的時候是把一個對象的內存地址賦值給函數內部的引用類型的局部變量
如上圖所示,兩個變量是指向同一個對象的。
在第二個例子中,咱們在函數內部新建立了一個對象,並從新賦值給內部變量p,實際上是改變了內部變量的引用所指向的對象,以下圖所示
因此對外部的p變量是沒有影響的。
總結:
函數參數傳遞實際上是一個賦值的過程,基本類型傳遞的是數值,引用類型傳遞的引用對象的內存地址。
另一點要特別注意,函數的參數實際上是函數內部的局部變量。不要跟外部變量混淆
以上內容均爲原創,轉載請註明出外 http://www.cnblogs.com/taixuyingcai/p/6373423.html