Java经典问题:传值与传引用?

开发 后端
Java到底是传值还是传引用?相信很少有人能完全回答正确。通常的说法是:对于基本数据类型(整型、浮点型、字符型、布尔型等),传值;对于引用类型(对象、数组),传引用。基本类型传值,所有人都不会对此有疑义;问题出在引用类型上。

Java到底是传值还是传引用?相信很少有人能完全回答正确。通常的说法是:对于基本数据类型(整型、浮点型、字符型、布尔型等),传值;对于引用类型(对象、数组),传引用。基本类型传值,所有人都不会对此有疑义;问题出在引用类型上。

为引入正题,不妨先看看下面的例子,你能正确给出程序的运行结果嘛?

 

  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. }   

 

上面程序的正确运行结果为:

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. 探秘JDK 7之四:下一代I/O(NIO.2)
  2. 性能优化总结:CPU和Load、NIO以及多线程
  3. Java 7 NIO2高性能Web服务器并发连接的处理
  4. 初试Java 7 NIO2:实现高性能的HTTP Server
  5. Google技术演讲介绍Java 7 NIO.2概览
责任编辑:金贺 来源: ITEYE博客
相关推荐

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页面传值

2010-01-25 15:15:46

Android传值

2011-05-19 17:49:08

ActivityAndroid开发

2021-05-19 09:53:16

SpringbootMyBatisMySQL

2013-06-03 10:22:41

iOS开发移动开发页面间传值

2013-07-24 16:47:23

iOS开发学习iOS协议代理传值

2016-09-18 19:07:33

Java值传递引用传递

2011-04-08 10:36:38

MFC多线程

2023-04-18 09:17:40

父子组件Vue

2012-05-14 21:14:07

Android页面传值

2024-07-03 08:04:34

2009-07-03 13:24:56

JSP表单

2024-10-29 09:08:07

2009-09-07 03:44:50

C#窗体间传值

2009-09-07 03:58:42

WinForm传值

2010-05-11 16:55:12

Windows Pho
点赞
收藏

51CTO技术栈公众号