Java的java string.format是值传递还是引用传递?

1)">1)">1" ng-class="{current:{{currentPage==page}}}" ng-repeat="page in pages"><li class='page' ng-if="(endIndex<li class='page next' ng-if="(currentPage
相关文章阅读java中有无引用传递
[问题点数:100分,结帖人zhou9898]
java中有无引用传递
[问题点数:100分,结帖人zhou9898]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关帖子推荐:
2012年8月 总版技术专家分月排行榜第三2012年7月 总版技术专家分月排行榜第三
2014年8月 高性能开发大版内专家分月排行榜第一2013年11月 高性能开发大版内专家分月排行榜第一2012年12月 Java大版内专家分月排行榜第一2012年11月 Java大版内专家分月排行榜第一2012年10月 Java大版内专家分月排行榜第一2012年9月 Java大版内专家分月排行榜第一2012年8月 Java大版内专家分月排行榜第一2012年7月 Java大版内专家分月排行榜第一2012年6月 Java大版内专家分月排行榜第一2012年5月 Java大版内专家分月排行榜第一2012年4月 Java大版内专家分月排行榜第一2012年3月 Java大版内专家分月排行榜第一2012年2月 Java大版内专家分月排行榜第一2012年1月 Java大版内专家分月排行榜第一
2012年8月 总版技术专家分月排行榜第三2012年7月 总版技术专家分月排行榜第三
2014年8月 高性能开发大版内专家分月排行榜第一2013年11月 高性能开发大版内专家分月排行榜第一2012年12月 Java大版内专家分月排行榜第一2012年11月 Java大版内专家分月排行榜第一2012年10月 Java大版内专家分月排行榜第一2012年9月 Java大版内专家分月排行榜第一2012年8月 Java大版内专家分月排行榜第一2012年7月 Java大版内专家分月排行榜第一2012年6月 Java大版内专家分月排行榜第一2012年5月 Java大版内专家分月排行榜第一2012年4月 Java大版内专家分月排行榜第一2012年3月 Java大版内专家分月排行榜第一2012年2月 Java大版内专家分月排行榜第一2012年1月 Java大版内专家分月排行榜第一
2012年8月 总版技术专家分月排行榜第三2012年7月 总版技术专家分月排行榜第三
2014年8月 高性能开发大版内专家分月排行榜第一2013年11月 高性能开发大版内专家分月排行榜第一2012年12月 Java大版内专家分月排行榜第一2012年11月 Java大版内专家分月排行榜第一2012年10月 Java大版内专家分月排行榜第一2012年9月 Java大版内专家分月排行榜第一2012年8月 Java大版内专家分月排行榜第一2012年7月 Java大版内专家分月排行榜第一2012年6月 Java大版内专家分月排行榜第一2012年5月 Java大版内专家分月排行榜第一2012年4月 Java大版内专家分月排行榜第一2012年3月 Java大版内专家分月排行榜第一2012年2月 Java大版内专家分月排行榜第一2012年1月 Java大版内专家分月排行榜第一
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。译文路径:
Java String对象以“引用”方式被传递
这是Java的一个经典问题。很多类&#20284;的问题已经在StackOverflow被问,这里面有很多的不正确/不完整的答案。这个问题很简单,如果你不去想太多。但如果你更深入地思考,它可能是非常令人困惑的。
1、一个段有趣和令人困惑的代码
public static void main(String[] args) {
String x = new String(&ab&);
change(x);
System.out.println(x);
public static void change(String x) {
打印结果:ab
在C&#43;&#43;中,代码如下
void change(string &x) {
int main(){
string x = &ab&;
change(x);
cout && x &&
打印结果:cd
2、常见的困惑问题
x存储指向堆中的“ab”字符串的引用。所以,当x被作为参数传递到change()方法时,它仍然指向堆中“ab”,像下面这样:
因为java是按&#20540;传递的(pass-by-value), x的&#20540;是“ab”的引用。当方法的change()被调用,它会创建一个新的“cd”的对象,而x现在是指向“cd”像下面这样:
这&#20284;乎是一个相当合理的解释。他们明确表示,Java是总是传递按&#20540;。但是,错在哪里呢?
3、代码真正做了些什么呢?
上面的解释有几个错误。为了容易理解这一点,这是一个好主意,简单地描述整个过程。
当字符串“ab”被创建,java分配存储字符串对象所需的内存空间。然后,将对象分配给变量x,该变量是被实际分配的引用对象。此引用是该对象被存储在内存的地址。
变量x包含一个字符串对象的引用。 x不是引用本身!它是用于存储一个引用(内存地址)的变量。
Java是仅仅是按&#20540;传递。当x传递给change()方法,x的(引用)&#20540;的副本被传递。方法change()创建另一个对象“cd”,它有一个不同的引用。它是被改变的x副本指向“cd”的变量,而不是x引用本身。
下面的图表展现了真实的过程:
4、错误的解释
从第一个代码片段中所提出的问题是没有联系到String对象的不变性。即使字符串被替换StringBuilder的,结果还是一样。关键的一点是,变量存储的是引用,而不是引用本身!
5、这个问题的解决方法
如果我们真的需要改变对象的&#20540;。首先,对象应该是可变的,例如,StringBuilder对象。其次,我们需要确保没有创建新的对象并将此对象分配给参数变量,因为Java是只是按&#20540;传递(passing-by-value)。
public static void main(String[] args) {
StringBuilder x = new StringBuilder(&ab&);
change(x);
System.out.println(x);
public static void change(StringBuilder x) {
x.delete(0, 2).append(&cd&);
Related posts:
&#65279;&#65279;
&#65279;&#65279;
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:81193次
积分:1530
积分:1530
排名:第10611名
原创:61篇
转载:24篇
评论:37条
(3)(1)(2)(1)(1)(1)(3)(3)(14)(10)(10)(16)(3)(1)(2)(4)(3)(1)(6)(4)java中的值传递,引用传递 - 推酷
java中的值传递,引用传递
无意中看到一个问题,java是值传递还是引用传递,有人说只有值传递,有人说值传递和引用传递都有,我一直认为是值传递和引用传递都有的,原始数据类型以及其封装类型是值传递,如int,Integer,再被别的方法使用的时候,传递的只是值,或者说是复制了一份内容,给新的方法,方法的处理不会影响方法体之外的该对象。复杂数据类型为引用传递,如自定义的一个Dog,传递的是该类的对象的引用,在方法体内修改所传递的对象的属性值,方法体外的对象的相应属性值也会被改变,所以相当于传递的是对象的本身。如果说非要说只有值传递的话,那么针对我理解的引用传递来说,传递的是对象引用的内存地址的值。
但是有个类型比较特殊,String,他不是基本数据类型,也不是基本数据类型的封装类型,应该是属于一个复杂数据类型,但是它为什么也不能进行引用传递呢,因为
String是不可变对象
,一旦声明初始化值之后就会回再发生值的变化,在方法体内对其进行操作,其实是
中新建了一个常量值。所以String类型的值传递进去也是不可以被更改的,其内部实现是重载了+号操作符,采用StringBuilder的方式重新创建了String的对象。
包括字符串拼接方法 concat,是返回了一个new String的对象
如有理解有误的地方,欢迎拍砖。
已发表评论数()
&&登&&&陆&&
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见java参数传递时到底是值传递还是引用传递
java参数传递时到底是值传递还是引用传递(baidu搜集)最近比较长一段时间以来,网上的IT同行里面比较流行&JAVA面试32问&,很多人的BLOG里都引用这些面试题,最近因为工作内容比较枯燥,也来看看这些试题以调节一下口味,其中有一道题让我很费解。
原题是:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
用google查询结果,得到答案基本上是:值传递。当时觉得挺纳闷儿,为什么连参数的内容都被修改了,怎么还能说是&值传递&呢?因为在传统的印象里(尤其是从C++过来以后),值传递都应该是不改变原参数的。
问问周围的同事,也大都这么讲,但是也都讲不清这种理论的根源是什么。我这个人有个毛病,有事情想不通时就会憋得难受,后来在《Thinking in Java》的一段内容(注解[1])里找到了自己的结论,我认为(《Thinking in Java》的作者也这么认为):可以说是值传递,也可以说是引用传递。
一,认为是值传递。得出这种结论的前提必须是&参数的值就是对该对象的引用,而不是对象的内容&,这句话可能有些费解,举个例子加以说明。
public class Paier {
&&&& public static void main(String[] args) {
&&&&&&&&&&&&&&&&&&& Paier paier = new Paier();
&&&&&&&&&&&&&&&&&&& paier.test();
&&&& public void test() {
&&&&&&&&&&&&&&&&&&& TestClass para1 = new TestClass();
&&&&&&&&&&&&&&&&&&& para1.setTest(new Integer(10));
&&&&&&&&&&&&&&&&&&& TestClass result1 = test1(para1);
&&&&&&&&&&&&&&&&&&& System.out.println(&para1&& = & + para1.getTest());
&&&&&&&&&&&&&&&&&&& System.out.println(&result1 = & + result1.getTest());
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&& TestClass para2 = new TestClass();
&&&&&&&&&&&&&&&&&&& para2.setTest(new Integer(10));
&&&&&&&&&&&&&&&&&&& TestClass result2 = test2(para2);
&&&&&&&&&&&&&&&&&&& System.out.println(&para2&& = & + para2.getTest());
&&&&&&&&&&&&&&&&&&& System.out.println(&result2 = & + result2.getTest());
&&&& public TestClass test1(TestClass t) {
&&&&&&&&&&&&&&&&&&& t = new TestClass();
&&&&&&&&&&&&&&&&&&& t.setTest(new Integer(20));
&&&&&&&&&&&&&&&&&&&
&&&& public TestClass test2(TestClass t) {
&&&&&&&&&&&&&&&&&&& t.setTest(new Integer(20));
&&&&&&&&&&&&&&&&&&&
&&&& class TestClass {
&&&&&&&&&&&&&&&&&&& Integer test =
&&&&&&&&&&&&&&&&&&& public void setTest(Integer i) {
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& test =
&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&& public Integer getTest() {
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&& }
执行后的结果是:
para1&& = 10
result1 = 20
para2&& = 20
result2 = 20
为什么会这样呢?因为test1想通过修改参数的引用来修改返回值,但是在JAVA中,参数的引用是不可修改的,所以para1和result1分别指向不同的空间,结果也不一样。而在test2中,result2和para2始终指向同一块区域,test2方法修改的是参数内容,而不是参数的引用。
从上面看来,因为参数的引用不可改变,如果理解为&参数的值就是对该对象的引用&,那么java自然只有值传递。
二,认为是引用传递。还是上面的例子,如果在参数传递时理解为&参数的值就是该对象的内容&,那么显然不是值传递,因为对象的内容已经改变了。
认为是引用传递还有一个理由,就是java有一个保留字byvalue,现在的JDK版本中还没有实现这个保留字,似乎是在暗示对这种观点的支持。(There appears to be some support for this view within Sun, since one of the &reserved but not implemented& keywords is byvalue.)
所以说,对于原题的结论,是值传递还是引用传递并不重要,重要的是要理解&对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。&
注解[1]:下面是在《Thinking in Java》中的原文:
This brings up the terminology issue, which always seems good for an argument. The term is &pass
by value,& and the meaning depends on how you perceive the operation of
the program. The general meaning is that you get a local copy of
whatever you&re passing, but the real question is how you think about
what you&re passing. When it comes to the meaning of &pass by value,&
there are two fairly distinct camps:
passes everything by value. When you&re passing primitives into a
method, you get a distinct copy of the primitive. When you&re passing a
handle into a method, you get a copy of the handle. Ergo, everything is
pass by value. Of course, the assumption is that you&re always thinking
(and caring) that handles are being passed, but it seems like the Java
design has gone a long way toward allowing you to ignore (most of the
time) that you&re working with a handle. That is, it seems to allow you
to think of the handle as &the object,& since it implicitly
dereferences it whenever you make a method call.
passes primitives by value (no argument there), but objects are passed
by reference. This is the world view that the handle is an alias for
the object, so you don&t think about passing handles, but
instead say &I&m passing the object.& Since you don&t get a local copy
of the object when you pass it into a method, objects are clearly not
passed by value. There appears to be some support for this view within
Sun, since one of the &reserved but not implemented& keywords is byvalue. (There&s no knowing, however, whether that keyword will ever see the light of day.)
given both camps a good airing and after saying &It depends on how you
think of a handle,& I will attempt to sidestep the issue for the rest
of the book. In the end, it isn&t that important & what is
important is that you understand that passing a handle allows the
caller&s object to be changed unexpectedly.
&&最后修改于
请各位遵纪守法并注意语言文明}

我要回帖

更多关于 java string.format 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信