偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Java經(jīng)典問題:傳值與傳引用?

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

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

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

 

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

 

上面程序的正確運(yùn)行結(jié)果為:

Mighty Mouse

Mouse Mighty

你答對了嘛?

下面我們來分析一下:為什么會出現(xiàn)上面的運(yùn)行結(jié)果?

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

 

 

當(dāng)調(diào)用swap(stra, strb)函數(shù)時,傳遞的是引用類型stra、strb的拷貝值,因此函數(shù)中任何對參數(shù)的改變都不會影響到stra和strb的值;而調(diào)用swap(strArr)時,傳遞的是strArr的拷貝值,程序中對參數(shù)的任何改變?nèi)匀徊粫绊懙絪trArr的值,然而swap(T[] t)中改變的并不是strArr的值,而是strArr[0]和strArr[1]的值,也就是引用類型strArr所指向的對象的值,因而strArr[0]和strArr[1]的值發(fā)生了變化。

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

【編輯推薦】

  1. 探秘JDK 7之四:下一代I/O(NIO.2)
  2. 性能優(yōu)化總結(jié):CPU和Load、NIO以及多線程
  3. Java 7 NIO2高性能Web服務(wù)器并發(fā)連接的處理
  4. 初試Java 7 NIO2:實(shí)現(xiàn)高性能的HTTP Server
  5. Google技術(shù)演講介紹Java 7 NIO.2概覽
責(zé)任編輯:金賀 來源: ITEYE博客
相關(guān)推薦

2009-05-06 16:10:17

Java傳值引用

2023-11-29 09:47:11

C++對象

2012-06-29 13:31:56

ServletJSPJava

2021-05-27 05:35:45

Go傳值傳引用

2009-07-06 10:00:31

JSP頁面?zhèn)髦?/a>

2010-01-25 15:15:46

Android傳值

2013-07-24 16:47:23

iOS開發(fā)學(xué)習(xí)iOS協(xié)議代理傳值

2011-05-19 17:49:08

ActivityAndroid開發(fā)

2021-05-19 09:53:16

SpringbootMyBatisMySQL

2013-06-03 10:22:41

iOS開發(fā)移動開發(fā)頁面間傳值

2016-09-18 19:07:33

Java值傳遞引用傳遞

2011-04-08 10:36:38

MFC多線程

2009-09-07 03:44:50

C#窗體間傳值

2009-09-07 03:58:42

WinForm傳值

2012-05-14 21:14:07

Android頁面?zhèn)髦?/a>

2023-04-18 09:17:40

父子組件Vue

2024-10-29 09:08:07

2009-07-03 13:24:56

JSP表單

2024-07-03 08:04:34

2010-05-11 16:55:12

Windows Pho
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號