日期:2014-05-20  浏览次数:21265 次

Java如何在函数中修改传入参数的值
问题如上,是不是Java不能像C++一样使用指针或引用来实现这个,
好像Java可以使用引用来实现对类的修改,但像String、Integer等不能实现
是不是这几个类机制和一般类不一样,我不大懂,请教先

------解决方案--------------------
你所说的修改传入的参数的值,一般不就是指用=来操作么。
比如 i=5 ,Str = "String " ,MyObject = new MyObject();本质都是类似这样的.
那么类似 i = 5 ,简单类型,你把它做参数,java是复制一个它的值过去,所以你在方法里再怎么改也只是改克隆品.
那么 str = "String "呢,这句其实只做了一件事,就是把str这个指向String类型的引用指向了新的String对象“String”。那么它对你str原来引用那个String有什么实际改变么?没有。
而且最重要的是,你在原来的方法里的str现在还是指向原来的值。为什么呢?因为java在传方法参数的时候,他传得是值。也就是说java把你原来的str这个引用复制了一份。然后当参数传进去了。所以,你在方法体里把str指向改变了,对原始的str无影响。
那么到底什么时候能通过传入的参数改变对象自己呢?你这样考虑,原始的str和新复制的str他们有什么共同点?那就是他们都指向原来的“oldString”这个对象。所以,只能是通过“oldString”这个对象自己提供的方法来改变它。这不就是封装么?你str又不是String,你只是一个引用,怎么可能通过一个=操作,就把人家一个对象改变呢?要想变就给用人家对象自己提供的方法来变。
-------------------------------
废话太多了,我自己都受不来了。总之一句话,java里面,所谓的引用,它的作用只能是提供个标志让你在代码里面引用。他不能去操作对象。要想操作对象,前提是对象自己提供方法。

------解决方案--------------------
Java passes primitives by value (no argument there), but objects are passed by reference.
建议楼主看一下thinking in java的Passing & Returning Objects章节
------解决方案--------------------
Java对原始数据类型的变量是操作类似C语言的传值调用,对引用类型的变量操作类似于C语言的引用调用,如果要对引用变量作修改,就必须在方法里始终操作传入的变量,而不对该变量赋予新的对象
------解决方案--------------------
String,Integer不能改,是因为它们根本就没有提供可以修改成员数据的方法。除非你另外创建一个对象。
int,char不能改,是因为传值调用,改掉的是副本。