困擾多年的“值傳遞,引用傳遞”問題,今晚茅塞頓開!
轉載來自:http://nileader.blog.51cto.com/1381108/303501
在Java中,所有的方法參數,都是"按值傳遞".
有那麼一種說法,Java中基本類型是按值傳遞,對象是按引用傳遞.這個說法其實是不確切的,確切的說法是
Java中基本類型將值作爲參數,按值傳遞.對象將引用作爲參數,按值傳遞.
所謂按值傳遞,就是傳遞的是一個副本.
現在來解釋下Java方法傳遞引用時的情況.
比如說有一個引用 Body body = new Body(.....);
將body當作參數傳遞的時候,傳遞的不是body指向的對象,也不是body引用本身,而是body的一個副本,並且這個副本和body是一模一樣. 這裏的一模一樣就是body和副本指向同一個對象.
那麼當body的副本進入方法後,對這個副本的修改同樣會影響body.
但是如果進入方法後將body的副本指向其它對象的時候,那麼和body是一點關係都沒有了.
下面來看看程序就明白了.
- public class TestParam {
- public static void main(String[] args) {
- Body var1 = new Body(1);
- Body var2 = var1;
- doSomething( var2 );
- System.out.println( var1.a );
- System.out.println(var2.a);
- System.out.print(var1 == var2);
- }
-
- public static void doSomething(Body body) {
- body.a = 2;
- }
- }
- class Body {
- public Body(int a) {
- this.a = a;
- }
- int a;
- }
輸出的結果是:
2
2
true
這個結果不難理解.
再看一個
- public class TestParam {
- public static void main(String[] args) {
- Body var1 = new Body(1);
- Body var2 = var1;
- doSomething( var2 );
- System.out.println( var1.a );
- System.out.println(var2.a);
- System.out.print(var1 == var2);
- }
-
- public static void doSomething(Body body) {
- body = new Body(2);
- }
- }
- class Body {
- public Body(int a) {
- this.a = a;
- }
- int a;
- }
輸出的結果是
1
1
true
兩個程序就是在參數進入方法體之後的處理有所區別.
針對第二個程序,畫一個草圖.