在java中,不容許程序員選擇值傳遞仍是地址傳遞各個參數,基本類型老是按值傳遞。對於對象來講,是將對象的引用也就是副本傳遞給了方法,在方法中只有對對象進行修改才能影響該對象的值,操做對象的引用時是沒法影響對象。java
如今說說數組:若是將單個基本類型數組的元素傳遞給方法,並在方法中對 其進行修改,則在被調用方法結束執行時,該元素中存儲的並非修改後的值,由於這種元素是按值傳遞,若是傳遞的是數組的引用,則對數組元素的後續修改能夠 在原始數組中反映出來(由於數組自己就是個對象,int[] a = new int[2];,這裏面的int是數組元素的類型,而數組元素的修改是操做對象)。程序員
public class Test{ String str = new String("good"); char[] ch = {'a','b','c'}; int i = 10; public void change(String str,char[] ch,int i){ str = "test ok"; ch[0] = 'g'; i++; } public static void main(String[] args){ Test tt = new Test(); tt.change(tt.str,tt.ch,tt.i); System.out.println(tt.i); System.out.print(tt.str+" and "); System.out.println(tt.ch); }
tr是String類型的引用,i是基本類型變量,ch是數組名,也是數組對象的引用數組
在chang()方法裏,str="test ok",是一個新的對象把首地址放在引用變量str上;this
而ch[0]='g';由於傳的是數組的引用,而此時ch[0]='g';是對數組元素的操做,能修改源數組的內容;spa
i是整型值,只是把值copy了一份給方法,在方法的變化是不改變的源i的。.net
因此結果是:對象
10blog
good and gbcclass
public class Test{ String str = new String("good"); char[] ch = {'a','b','c'}; int i = 10; public void change(String str,char ch,int i){ str = "test ok"; ch = 'g'; this.i = i+1; } public static void main(String[] args){ Test tt = new Test(); tt.change(tt.str,tt.ch[0],tt.i); System.out.println(tt.i); System.out.print(tt.str+" and "); System.out.println(tt.ch); } }
仔細觀察下實參以及入參有何變化?test
change()方法裏的入參char[] ch變成--------------char ch;
此次傳遞的是個char值的單個數組元素,按照上面的解析,此時ch='9';是不影響源數組元素的。
this.i = i+1;這裏面等號左邊的i是屬性i,等號右邊的i是局部變量(入參裏的i);
此時i+1後賦值給屬性的i,天然會改變屬性i的值,同時17行,tt.i又是調用屬性的i,此次的結果是:
11
good and abc
http://blog.csdn.net/niuniu20008/article/details/2953785