值傳遞與引用傳遞

weixin_33890499發表於2016-11-03

一般資料型別(byte,char,int,float,double,long,String,Integer,Long,Float,Double)是值傳遞,也可以稱為拷貝傳遞,即拷貝實參的值然後初始化形參;其他的(Object)是引用傳遞,即傳遞地址,引用傳遞形參可以修改實參例項成員的值,但不能借助重新給形參賦值而間接地讓實參指向一個新的堆地址。

private void f3(StringBuilder s) {
    s.append(",haha");
    s = new StringBuilder("hello,bitch");
}

StringBuilder stringBuilder = new StringBuilder("yui");
f3(stringBuilder);
System.out.println(stringBuilder);

output:

yui,haha

可以用 幀棧 或者 全域性變數和區域性變數 來解釋:

f3()的方法形參為 StringBuilder s ,可以理解為在f3()函式的內部宣告一個 StringBuilder s 變數,當執行 f3(stringBuilder) 呼叫操作時,實際上是用實參 StringBuilder stringBuilder 指向的堆 new StringBuilder("yui")地址 來初始化 s,但是,在棧上看來,stringBuidlers 是兩個不同的地址,在執行 s.append(",haha"); 時,stringBuidlers指向的是堆上的同一個地址,所以 s 可以修改 new StringBuilder("yui") 例項的值。執行 s = new StringBuilder("hello,bitch") 賦值語句時,只是把方法內部宣告的 StringBuilder s 變數指向新的堆地址 StringBuilder("hello,bitch"),但棧上的 stringBuilder 仍然指向 new StringBuilder("yui")

引用傳遞只是傳遞 實參指向的堆地址 而不是傳遞 實參棧上地址的引用

相關文章