博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】Java经典问题:传值与传引用?
阅读量:6810 次
发布时间:2019-06-26

本文共 1966 字,大约阅读时间需要 6 分钟。

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]的值发生了变化。

从上面的分析,我们可以得出结论:对于引用类型,其实参数传递时仍然是按值传递的;当然,按引用传递也不是完全没有道理,只是参考对象不是引用类型本身,而是引用类型所指向的对象。

转载于:https://www.cnblogs.com/wumrwds/p/5296437.html

你可能感兴趣的文章
MySQL---数据库从入门走向大神系列(十)-Connection对象池、装饰模式与动态代理模式...
查看>>
阿里云oss挂载到linux本地文件系统
查看>>
接班人不是克隆出来的:华为再显接班难
查看>>
把自1970年1月1日以来的秒数转化成年月日
查看>>
NetApp公司利用IBM沃森打造一款名为Elio的卡通机器人
查看>>
微信红包限额提升方法
查看>>
log file sync 等侍值高的一般通用解决办法
查看>>
《maven实战》学习笔记7——maven项目版本管理和灵活构建
查看>>
嵌入式 linux 查看内存
查看>>
mysql 协议的server状态标识
查看>>
CSDN去广告小脚本
查看>>
辟谣!Java 9使用指南10大误解,你中了几条?
查看>>
KSQL,用于Apache Kafka的流数据SQL引擎
查看>>
Zeppelin对Spark进行交互式数据查询和分析
查看>>
漂亮的后台界面PSD下载
查看>>
REST_FRAMEWORK加深记忆-第二次练习官方文档2
查看>>
NGINX配置小随笔
查看>>
大数据能帮企业抓住网络入侵者吗?
查看>>
BoCloud博云完成近亿元融资,加速PaaS与云运维落地
查看>>
IEEE:全球超一半大公司正在研究区块链,但是你需要区块链吗?
查看>>