`
ihuashao
  • 浏览: 4723152 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Java新手进阶:细说引用类型

阅读更多
  在前几天的帖子“Java性能优化[1]:基本类型 vs 引用类型 ”里,大概介绍了引用类型和基本类型在存储上的区别。昨天有网友在评论中批评说“引用类型变量和它所引用的对象”没区分清楚,容易混淆。所以今天专门来说一下引用类型的相关细节。<!-- program-think-->另外,也把原先的帖子 中,关于“两种类型的存储方式”这节修改了一下,加点插图,有助于大伙儿的理解。
  其实,引用类型的变量非常类似于C/C++的指针。为了形象起见,也为了打字方便,本文后面的内容,都把“引用类型的变量”称为指针 。所以,如果你原先有C/C++背景,今天讲的内容对你来说应该很好理解;否则的话,可能要多琢磨琢磨了。

  ★创建问题
  假设我们在函数中 写了如下这个简单的语句:
StringBuffer str = new StringBuffer("Hello world");
别看这个语句简单,其实包含了如下三个步骤:
  首先,new StringBuffer("Hello world") 里申请了一坨内存,把创建好的StringBuffer对象放进去。
  其次,StringBuffer str 声明了一个指针。这个指针本身是存储在 上的(因为语句写在函数中 ),可以用来指向某个StringBuffer类型的对象。或者换一种说法,这个指针可以用来保存某个StringBuffer对象的地址。
  最后,当中这个等于号 (赋值符号)把两者关联起来,也就是把刚申请的那一坨内存的地址保存成str的值。
  把上次帖子 的图片再拿出来秀一下:

不见图、请

  ★引用对象之间的赋值、判相等
  通过上述的图解,大伙儿应该明白指针变量和该指针变量指向的对象 是一个什么关系了吧。
  还是接着刚才的例子,再来看赋值的问题。对于如下语句:
  StringBuffer str2 = str;
  这个赋值语句是啥意思捏?实际上就是把str的地址复制给str2,记住,是地址的复制,StringBuffer对象本身并没有复制。所以两个指针指向的是同一个东东。
  再搞一张示意图,如下(今天画这些图把我累坏了):

不见图、请

  明白了赋值,判断相等的问题(就是==操作符)也就简单了。当我们写如下语句“if(str2 == str) ”时,只是判断两个指针的 (也就是对象的地址)是否相等,并不是判断被指向的对象 是否内容相同。
  实际上两个指针的值相同,则肯定是指向同一个对象(所以对象内容必定相同)。但是两个内容相同的对象,它们的地址可能不一样(比如克隆出来的多个对象之间,地址就不同)。

  ★final常量的问题
  针对引用类型变量的final修饰符也是很多人搞混淆的地方。实际上final只是修饰指针的值(也就是限定指针保存的地址不能变)。至于该指针指向的对象,内容是否能变,那就管不着了。所以,对于如下语句:
  final StringBuffer strConst = new StringBuffer();
  你可以修改它指向的对象的内容,比如:
  strConst.append(" ");
  但是不能 修改它的值,比如:
  strConst = null;

  ★传参的问题
  引用类型(在函数调用中)的传参问题,是一个相当扯的问题。有些书上说是传值,有些书上说是传引用。搞得Java程序员都快成神经分裂了。所以,我们最后来谈一下“引用类型参数传递”的问题。
  还是拿刚才的例子,假设现在要把刚才创建的那一坨字符串打印出来,我们会使用如下语句:
System.out.println(str);
这个语句又是什么意思捏?这时候就两说了。
  第一种理解:
可以认为传进函数的是str这个指针,指针说白了就是一个地址的值,说得再白一点,就是个整数。按照这种理解,就是传值的方式。也就是说,参数传递的是指针本身,所以是传值的。
  第二种理解:
可以认为传进去的是StringBuffer对象,按照这种理解,就是传引用方式了。因为我们确实是把对象的地址(也就是引用)给传了进去。
  费了这么多口水,其实不论是传引用 还是传值 ,都可以讲得通,关键取决于你是如何看待 参数所传递的东西 。这就好比量子力学中“光的波粒二象性”,如果你以粒子的方式去测量它,它看起来像粒子;如果你以波动的方式去观测它,它看起来像波动。假如你不太懂量子力学,前面这话当我没说 :-)


版权声明
本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者编程随想 和本文原始地址:

http://program-think.blogspot.com/2009/03/java-reference-types-detail.html

分享到:
评论

相关推荐

    高级架构师必备莲花宝典:细说系统架构

    高级架构师必备莲花宝典:细说系统架构

    20210818-平安证券-地产行业杂谈系列之十三:细说物业管理第三方拓展之道.pdf

    百强物业管理企业在2021年上半年中标项目中,43%是住宅物业,其余则包括办公、商业、园区、学校等多种类型的物业。 此外,报告对未来第三方拓展的趋势进行了思考。自主外拓由于整合难度低和协同效应好,被认为是...

    浩瀚大洋是赌场:细说日本海军史(全3册) (俞天任) (z-lib.org).azw3

    浩瀚大洋是赌场:细说日本海军史(全3册) (俞天任) (z-lib.org).azw3

    互联网传媒行业:细说大厂2019新游储备,手游市场增速望持续回暖-20190522-中信建投-23页.pdf

    报告标题:“互联网传媒行业:细说大厂2019新游储备,手游市场增速望持续回暖” 报告描述:该报告关注2019年互联网传媒行业中的大型游戏公司(大厂)的新游戏储备情况,指出移动游戏市场有望在经历了2018年的低谷后...

    20210818-平安证券-地产行业杂谈系列之十三:细说物业管理第三方拓展之道.rar

    本报告“20210818-平安证券-地产行业杂谈系列之十三:细说物业管理第三方拓展之道”深入探讨了物业管理公司在第三方市场拓展中的策略和挑战。 在物业管理领域,第三方拓展是指物业公司不再仅仅依赖于开发母公司提供...

    地产杂谈系列之十三:细说物业管理第三方拓展之道.pdf

    由于新建住宅的拓展空间有限,而且存量住宅的拓展难度较高,物管企业开始探索多元化的拓展途径,如办公、商业、园区、学校等不同类型的项目。这需要物管企业具备更广的服务覆盖范围和更深入的服务能力,以适应不同...

    互联网传媒行业:细说大厂新游储备,手游市场增速望持续回暖-0522-中信建投-23页.pdf

    这些公司不仅在MMORPG、卡牌、SLG等传统强势品类上继续布局,同时也在尝试多样化和细分化的游戏类型,如沙盒、二次元、Roguelike等,以满足不同玩家群体的需求。全球化发行也成为了大厂的重要策略,尤其对于主机和PC...

    新能源汽车产业链专题深度研究:细说造车新势力,遇见汽车新未来.pdf

    新能源汽车产业链专题深度研究 新能源汽车行业作为21世纪以来最具潜力的行业之一,其发展动态和技术进步一直备受业界关注。在新能源汽车产业链的研究中,我们特别关注造车新势力的崛起、行业格局的变化、以及造车...

    地产杂谈系列之十三:细说物业管理第三方拓展之道(2021)(16页).pdf

    【物业管理第三方拓展之道】指的是物业服务企业在扩展业务时,不再仅仅依赖于母公司或关联房地产公司的项目,而是积极寻求来自第三方的物业管理机会。这一策略在行业快速发展的背景下变得愈发重要,因为随着市场规模...

    细说Java之util类.

    Java中的`util`类是Java开发中不可或缺的一部分,它们提供了许多数据结构和工具类的实现,使得开发者可以方便地处理各种数据。`java.util`包是Java标准库的核心部分,包含了许多用于处理集合、时间日期、随机数生成...

    细说Java NIO

    2. **创建缓冲区**:`java.nio.ByteBuffer`是最常用的缓冲区类型,可以通过`allocate()`、`allocateDirect()`等方式创建。 3. **读写数据**:通过`channel.read(buffer)`和`channel.write(buffer)`方法在通道与缓冲...

    xsphp:细说PHP第一版原始码

    《xsphp:细说PHP第一版原始码》 PHP,全称“PHP:Hypertext Preprocessor”,是一种广泛使用的开源脚本语言,尤其在Web开发领域应用极为广泛。xsphp项目则是对PHP第一版源码的深入解析,旨在帮助开发者理解PHP的...

    细说java线程问题

    ### 细说Java线程问题:深入理解与实践 在Java编程中,线程是执行的基本单位,它允许程序在操作系统层面并发执行多个任务。掌握Java线程的原理及其使用方法,对于提升软件性能和响应性至关重要。本文将从线程的概念...

    《细说PHP》

    《细说PHP》作为一本面向PHP应用开发新手的入门教材,覆盖了PHP语言的基础知识和应用实践。书中内容既实用又全面,这使得它非常适合那些刚接触PHP或者准备开始PHP学习的读者。 首先,初学者需要了解的是PHP的基础...

    《细说php》光盘源码

    它的语法混合了C、Java、Perl等语言的特性,使得初学者能够快速上手,同时为经验丰富的开发者提供了足够的灵活性和功能性。 通过《细说PHP》的源码,我们可以学习到以下关键知识点: 1. **基础语法**:源码中包含...

    细说PHP第二版高洛峰.7z

    总之,《细说PHP第二版》是一本全面覆盖PHP基础知识和进阶概念的教程,无论你是刚接触PHP的新手还是希望巩固基础的学习者,都能从中受益匪浅。书中的实例和详细解释将帮助你轻松理解PHP编程,为后续的PHP开发工作...

    《细说PHP》光盘源码.rar

    《细说PHP》是一本深度解析PHP编程语言的专业书籍,其光盘源码rar压缩包包含了大量的示例代码和练习项目,旨在帮助读者深入理解PHP...无论是对PHP新手还是寻求进阶的开发者,《细说PHP》的源码都能提供宝贵的参考资料。

Global site tag (gtag.js) - Google Analytics