Java中String类型的参数传递问题的解析.doc_第1页
Java中String类型的参数传递问题的解析.doc_第2页
Java中String类型的参数传递问题的解析.doc_第3页
Java中String类型的参数传递问题的解析.doc_第4页
Java中String类型的参数传递问题的解析.doc_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

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

文档简介

一、最开始的示例写代码最重要的就是实践,不经过反复试验而得出的说辞只能说是凭空遐想罢了。所以,在本文中首先以一个简单示例来抛出核心话题:public class StringAsParamOfMethodDemo public static void main(String args) StringAsParamOfMethodDemo StringAsParamOfMethodDemo=new StringAsParamOfMethodDemo();StringAsParamOfMethodDemo.testA(); private void testA() String originalStr = original;System.out.println(Test A Begin:);System.out.println(The outer String: + originalStr);simpleChangeString(originalStr);System.out.println(The outer String after inner change: + originalStr)System.out.println(Test A End.);System.out.println(); public void simpleChangeString(String original) original = original + is changed!;System.out.println(The changed inner String: + original);这段代码的逻辑是这样的:先赋值一个String类型的局部变量,然后把这个变量作为参数送进一个方法中,在这个方法中改变该变量的值。编译运行之后,发现输出结果是这样的:Test A Begin:The outer String: originalThe changed inner String: original is changed!The outer String after inner change: originalTest A End.这个结果表明在方法内部对String类型的变量的重新赋值操作并没有对这个变量的原型产生任何影响。好了,这个示例的逻辑和运行结果都展示清楚了,接下来我们来对这个小程序进行分析。在这之前我们先来回顾下Java中所谓的“传值”和“传引用”问题。二、Java中的“传值”和“传引用”问题许多初学Java的程序员都在这个问题上有所思索,那是因为这是所谓的“C语言的传值和传指针问题”在Java语言上同类表现。最后得出的结论是:在Java中,当基本类型作为参数传入方法时,无论该参数在方法内怎样被改变,外部的变量原型总是不变的,代码类似上面的示例:int number = 0;changeNumber(number) number+; /改变送进的int变量System.out.println(number); /这时number依然为0这就叫做“值传递”,即方法操作的是参数变量(也就是原型变量的一个值的拷贝)改变的也只是原型变量的一个拷贝而已,而非变量本身。所以变量原型并不会随之改变。但当方法传入的参数为非基本类型时(也就是说是一个对象类型的变量),方法改变参数变量的同时变量原型也会随之改变,代码同样类似上面的示例:StringBuffer strBuf = new StringBuffer(“original”);changeStringBuffer(strBuf) strbuf.apend(“ is changed!”) /改变送进的StringBuffer变量System.out.println(strBuf); /这时strBuf的值就变为了original is changed!这种特性就叫做“引用传递”,也叫做传址,即方法操作参数变量时是拷贝了变量的引用,而后通过引用找到变量(在这里是对象)的真正地址,并对其进行操作。当该方法结束后,方法内部的那个参数变量随之消失。但是要知道这个变量只是对象的一个引用而已,它只是指向了对象所在的真实地址,而非对象本身,所以它的消失并不会带来什么负面影响。回头来看原型变量,原型变量本质上也是那个对象的一个引用(和参数变量是一样一样的),当初对参数变量所指对象的改变就根本就是对原型变量所指对象的改变。所以原型变量所代表的对象就这样被改变了,而且这种改变被保存了下来。了解了这个经典问题,很多细心的读者肯定会立刻提出新的疑问:“可是String类型在Java语言中属于非基本类型啊!它在方法中的改变为什么没有被保存下来呢!”的确,这是个问题,而且这个新疑问几乎推翻了那个经典问题的全部结论。真是这样么?好,现在我们就来继续分析。三、关于String参数传递问题的曲解之一?直接赋值与对象赋值 String类型的变量作为参数时怎么会像基本类型变量那样以传值方式传递呢?关于这个问题,有些朋友给出过解释,但可惜并不正确。一种解释就是,对String类型的变量赋值时并没有new出对象,而是直接用字符串赋值,所以Java就把这个String类型的变量当作基本类型看待了。即,应该String str = new String String originalStr = newString(original);System.out.println(Test C Begin:);System.out.println(The outer String: + originalStr);changeStrWithMethod(originalStr);System.out.println(The outer String after inner change: + originalStr);System.out.println(Test C End.);System.out.println();private static void changeStrWithMethod(String original) original = original.concat( is changed!);System.out.println(The changed inner String: + original);结果如下:Test C Begin:The outer String: originalThe changed inner String: original is changed!The outer String after inner change: originalTest C End.怎么样,这证明了问题并不是出在这,又一个解释在实践论据下夭折了。那到底是什么原因导致了这种状况呢?好了,不卖关子了,下面说下我的解释。五、String参数传递问题的症结所在其实,要想真正理解一个类或者一个API/框架的最直接的方法就是看源码。下面我们来看看new出String对象的那小段代码(String类中),也就是String类的构造函数:public String(String original) int size = original.count;char originalValue = original.value;char v;if (originalValue.lengthsize) / The array representing the String is bigger than the new/ String itself. Perhaps this constructor is being called/ in order to trim the baggage, so make a copy of the off = original.offset;v = Arrays.copyOfRange(originalValue, off, off+size); else / The array representing the String is the same/ size as the String, so no point in making a copy.v = originalValue;this.offset = 0;this.count = size;this.value = v;也许你注意到了里面的char,这说明对String的存储实际上通过char来实现的。怎么样?其实就是一层窗户纸。不知道大家还记不记得在Java API中定义的那些基本类型的包装类。比如Integer是int包装类、Float是float的包装类等等。对这些包装类的值操作实际上都是通过对其对应的基本类型操作而实现的。是不是有所感悟了?对,String就相当于是char的包装类。包装类的特质之一就是在对其值进行操作时会体现出其对应的基本类型的性质。在参数传递时,包装类就是如此体现的。所以,对于String在这种情况下的展现结果的解释就自

温馨提示

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

评论

0/150

提交评论