Yur*_*ura 24 java string function pass-by-reference
我有这个非常尴尬的问题......
void changeString(String str){
str = "Hello world":
}
main(){
String myStr = new String("");
changeString(myStr);
}
Run Code Online (Sandbox Code Playgroud)
当main
返回时,该值仍然""
不"Hello world"
.这是为什么?
另外,我如何使其工作?假设我希望我的函数changeString
将其变为"Hello world"的字符串.
Nul*_*ion 35
每个人都解释了为什么它不起作用,但没有人解释如何使它工作.最简单的选择是使用:
String changeString() {
return "Hello world";
}
main() {
String myStr = new String("");
myStr = changeString();
}
Run Code Online (Sandbox Code Playgroud)
虽然方法名称在这里用词不当.如果您使用原始想法,则需要以下内容:
void changeString(ChangeableString str) {
str.changeTo("Hello world");
}
main() {
ChangeableString myStr = new ChangeableString("");
changeString(myStr);
}
Run Code Online (Sandbox Code Playgroud)
你的ChangeableString
课可能是这样的:
class ChangeableString {
String str;
public ChangeableString(String str) {
this.str = str;
}
public void changeTo(String newStr) {
str = newStr;
}
public String toString() {
return str;
}
}
Run Code Online (Sandbox Code Playgroud)
在Java方法中,所有内容都按值传递.这包括参考.这可以通过以下两种不同的方法来说明:
void doNothing(Thing obj) {
obj = new Something();
}
void doSomething(Thing obj) {
obj.changeMe();
}
Run Code Online (Sandbox Code Playgroud)
如果doNothing(obj)
从main()
(或任何地方)obj
调用,将不会在被调用者中进行更改,因为doNothing
创建了一个new Thing
并obj
在方法范围内指定了新引用.
另一方面,在doSomething
你正在召唤obj.changeMe()
,并且那些取消引用obj
- 这是通过价值传递 - 并改变它.