【參考資料】
public void test() throws Exception { System.out.println("\nint:================="); int i = 2; System.out.println("before:" + i); change1(i); System.out.println("after:" + i); System.out.println("\nInteger:================="); Integer integer = 3; System.out.println("before:" + integer); change2(integer); System.out.println("after:" + integer); System.out.println("\nString:================="); String str = new String("xxx"); System.out.println("before:" + str); change3(str); System.out.println("after:" + str); System.out.println("\nString[]:================="); String[] array = new String[]{"a", "b", "c"}; System.out.println("before:" + array[0]); change4(array); System.out.println("after:" + array[0]); System.out.println("\nBook:================="); Book book = new Book("book1"); System.out.println("before:" + book.name); change5(book); System.out.println("after:" + book.name); System.out.println("\nint[]:================="); int[] int_array = new int[]{1, 2, 3}; System.out.println("before:" + int_array[0]); change6(int_array); System.out.println("after:" + int_array[0]); } public void change1(int i) { i = 4; } public void change2(Integer integer) { integer = (Integer) 8; } public void change3(String str) { str = new String("yyy"); } private void change4(String[] array) { array[0] = "A"; } private void change5(Book book) { book.name = "book2"; } private void change6(int[] int_array) { int_array[0] = 10; } private class Book { public String name; Book(String name) { this.name = name; } }
java到底是值傳遞仍是引用傳遞? (當中「三:調用方法時發生了什麼?」講的很是清晰)
html
java 中 Integer 傳參方式的問題,不是說Integer是引用傳遞麼?但爲何不會改變itpost
String 和 Integer 傳遞給方法時到底是不是傳遞引用??!this
!spa
http://java.sun.com/docs/books/tutorial/java/javaOO/arguments.html
When the argument is of reference type, pass-by-value means that the method cannot change the object reference, but can invoke the object's methods and modify the accessible variables within the object.
當參數是引用類型時。你能經過調用該引用所指向的對象自己的方法來改變對象自身,但是。你並不能改變該引用。(你改變的僅僅能是引用所指向的對象,而不是引用。.net因此,仍然是值傳遞。)code
不管你傳的是什麼,傳過去的都僅僅是一個副本而已,這個副本做爲方法的局部變量保存在棧中。對象
假設傳的是基本數據類型,改動這個值並不會影響做爲參數傳進來的那個變量,因爲你改動的是方法的局部變量,是一個副本。
假設傳的是一個對象的引用,也是同樣的,也是一個副本,但是這個副本和做爲參數傳進來的那個引用指向的是內存中的同一個對象,因此你經過這個副本也可以操做那個對象。但是假設你改動這個引用自己,比方讓他指向內存中的另一個對象,原來做爲參數傳進來的那個引用不會受到影響。
我認爲弄明確這些便可了,說值傳遞或引用傳遞都無所謂,但是說值傳遞更適合一些,這個值可以是引用也可以是基本數據類型。blog