Java方法的参数传递(三)_第1页
Java方法的参数传递(三)_第2页
Java方法的参数传递(三)_第3页
Java方法的参数传递(三)_第4页
Java方法的参数传递(三)_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Java方法的参数传递(三“不可变对象”的引用变量作为参数对非“不可变对象”的引用变量作为方法参数传递进行总结,认为“引用变量”型实参对所引用对象的改变是“以不变应万变”;而在“不可变对象”的引用变量作为方法参数传递时,“引用变量”型实参及其所引用对象都是“不变”的!那么,又是谁在改变,或者改变了什么?这就是百味峰爷将在Java方法的参数传递(三中进行总结的内容。一、什么是“不可变对象”?编程过程中,有时候需要禁止某个“对象”被改动内容。为此,Java提供了Immutable 类(譬如String类,该类的对象被称为“不可变对象”。根据定义,“不可变对象”是一种一旦构建好就不再变化的“对象”,

2、在其生存期间不可被改变内容。那么,Java中有哪些系统定义的Immutable类?名气最大的就是String类!除了它,还有就是8种基本类型对应的8个包装类(Wrapper Class:Byte、Short、Character、Integer、Long、Float、Double、Boolean。二、理论分析Java类中方法以“不可变对象”的“引用变量”作为形参,与Java方法的参数传递(二总结的“可变变量”的“引用变量”作为形参,在方法参数的传递过程中,有以下共同点:形参和实参在栈内存中同样都有各自独立的存储区。参数传递时,将“引用变量”实参的存储区中所存储数据(实参值进行复制,“复制值”存入

3、“引用变量”形参的存储区;因为“实参值”是特定“对象”在堆内存中存储的首地址,所以参数传递操作使得形参和实参一样成为该“对象”的引用变量,即指向相同的堆内存区。那么,不同点又在何处?“可变变量”的“引用变量”作为形参,参数传递之后,形参和实参共同引用的“对象”在堆内存(Heap中所分配到的存储区固定不变,而这个存储区内存放的内容可以变换!“不可变对象”的“引用变量”作为形参,参数传递之后,最初形参和实参共同引用一个相同的“对象”。但是,当试图改变这个共同引用的“对象”时,形参和实参就开始“分道扬镳”了!原因在于试图改变共引“对象”时,新创建了一个“新对象”,所做的改变都发生在“新对象”;那共引

4、的“对象”呢?它仍然存在,而且丝毫不变地存在;只是形参不再像实参那样忠贞地引用它,转而喜新厌旧地去引用“新对象”了。既然实参引用的还是老“对象”,而形参引用的是“新对象”,形参和实参就成了分手后的“陌生人”,不再相往来。如此一来,形参的任何变化都不会影响实参。三、例证说明范例程序ImmutableAsParameterDemo.java的源代码:public class ImmutableAsParameterDemopublic static void main(String argsImmutableAsParameterDemo immutableAsParameterDemo=new

5、ImmutableAsParameterDemo(;immutableAsParameterDemo.Test(;private void Test(String originalStr = "Immutable object"象:" + originalStr; 运行结果为: 三、分析 NullImmutableAsParameterDemo immutableAsParameterDemo=new ImmutableAsParameterDemo(FFF5 四、结论从以上分析可以看出,非“不可变”引用变量作为参数、“不可变”引用变量作为参数等两种情况,实参都是

6、将其存放的“对象地址”的复制值赋给了对应的形参。不同点只是体现在被调用方法体内,“不可变”引用变量形参指向了新的对象;而实参一直固执地指向最初的对象。既然形参和实参所引用对象都不一样了,所以在“不可变”引用变量作为参数情况下,形参不再影响实参,这就是非“不可变”引用变量作为参数、“不可变”引用变量作为参数等两种情况的最大差异!另外,需要说明的有两点:其一,在试图对“不可变对象”进行改变时,貌似改变对象本身的操作,但实际上是创建新对象;其二,虽然Java 虚拟机规范把存放“Immutable object is changed !”一类对象的方法存储区(Method area 描述为堆的一个逻辑

7、部分,但是它却有一个别名叫做Non-Heap (非堆,目的应该是与Java 堆内存区分开来;之所以在分析中的最后一幅图中那样绘制,目的仅仅是把描述的问题简单化。FFF5Immutable objectString originalStr = "Immutable object"FFF5originalStr FFF5 FFF5Immutable objectsimpleChange(originalStr;originalStr originalStrFFF5FFF5 FFACImmutable object Immutable object ischanged !original = original + " is changed !"originalStr originalFFF5 FFACFFF5Immutable object Immutable object i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论