程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java經典問題:傳值與傳引用?

Java經典問題:傳值與傳引用?

編輯:關於JAVA

Java到底是傳值還是傳引用?相信很少有人能完全回答正確。通常的說法是:對於基本數據類型(整型、浮點型、字符型、布爾型等),傳值;對於引用類型(對象、數組),傳引用。基本類型傳值,所有人都不會對此有疑義;問題出在引用類型上。

為引入正題,不妨先看看下面的例子,你能正確給出程序的運行結果嘛?

  1. /**
  2. * @(#)Swap.Java
  3. *
  4. *
  5. * @author
  6. * @version 1.00 2007/1/5
  7. */
  8. public class Swap {
  9. public Swap() {}
  10. public static void main(String[] args) {
  11. Changer c = new Changer();
  12. String stra = " Mighty " ;
  13. String strb = " Mouse " ;
  14. c.swap(stra, strb);
  15. System.out.println(stra + " " + strb);
  16. String[] strArr = new String[ 2 ] ;
  17. strArr[ 0 ] = stra;
  18. strArr[ 1 ] = strb;
  19. c.swap(strArr);
  20. System.out.println(strArr[ 0 ] + " " + strArr[ 1 ]);
  21. }
  22. static class Changer {
  23. public < T > void swap(T a, T b) {
  24. T temp = a;
  25. a = b;
  26. b = temp;
  27. }
  28. public < T > void swap(T[] t) {
  29. if (t.length < 2 ) {
  30. System.out.println( " error! " );
  31. return ;
  32. }
  33. T temp = t[ 0 ];
  34. t[ 0 ] = t[ 1 ];
  35. t[ 1 ] = temp;
  36. }
  37. }
  38. }

上面程序的正確運行結果為:

Mighty Mouse

Mouse Mighty

你答對了嘛?

下面我們來分析一下:為什麼會出現上面的運行結果?

為分析這個問題,我們必須對程序中的數據在內存中的布局有一定了解。上面main程序中和String相關的變量共有3個,其布局可以用下圖所示:

當調用swap(stra, strb)函數時,傳遞的是引用類型stra、strb的拷貝值,因此函數中任何對參數的改變都不會影響到stra和strb的值;而調用swap(strArr)時,傳遞的是strArr的拷貝值,程序中對參數的任何改變仍然不會影響到strArr的值,然而swap(T[] t)中改變的並不是strArr的值,而是strArr[0]和strArr[1]的值,也就是引用類型strArr所指向的對象的值,因而strArr[0]和strArr[1]的值發生了變化。

從上面的分析,我們可以得出結論:對於引用類型,其實參數傳遞時仍然是按值傳遞的;當然,按引用傳遞也不是完全沒有道理,只是參考對象不是引用類型本身,而是引用類型所指向的對象。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved