Java中傳值與傳遞引用的區分
阿新 • • 發佈:2019-01-01
基本型別傳的是值,例如:int,float,double,char,不包括 java.lang.String
物件例項,介面例項傳的是引用,包括java.lang.String。但是我們在通過一個函式傳遞String引數時,為何出來的結果沒有發生改變?如下所示:
void public func(String str){
str = "ssss";
}
String str = "s";
func(str);
System.out.println(str); //結果還是輸出 “s”
這是因為在func函式的 str = "ssss" 語句中,它潛在地 new 了一個物件,改變了對原始變數 str 的引用,因此 str = “ssss” 語句並不是作用在原始 str 變數中中。所以在函式退出時,原來的 String 引數還是沒有改變。 不過話說回來,對於其他型別的物件例項,我們傳遞的均是引用,會改變傳入引數的值。本質來說,傳引用也是傳值(控制代碼的值)。
在函式裡如果改變控制代碼的值:
比如新new了一個物件,控制代碼值就傳不出來,換個說法,如果你想讓傳進去物件(不是控制代碼)出了函式改變的話,一般都有.操作符,即
控制代碼.物件成員 = 新值。
用c語言的觀點是,傳一個物件的控制代碼就是傳進去一級指標比如p,如果你用了
p = new XXX或者p++;出來後根本不改變主調函式的p指向的內容。但是如果你用p->member = xxx;出來的話p指向的內容就改變了。
所以總結一下,java是傳值的(基本變數傳的是值的拷貝,物件傳的控制代碼的拷貝)。