public class API_Boolean {
public static void main(String[] args) {
// 第一次操作
String str = "aaa";
String newStr = test(str);
System.out.println(str); // "aaa"
// 第二次操作
String a = "xxx";
a = a + "yyy";
System.out.println(a); // "xxxyyy"
}
public static String test(String s) {
s = s + "bbb";
return s;
}
.你们的回答一点也没有解决问题啊。。。建议搜一下java值传递,。
简单的说,str是个对象,它实际保存的是内存地址(比如0x111之类),内存地址里存的是这个 aaa,
你调用方法时,传递的是 aaa 这个值,所以返回给newStr的是 aaabbba没问题,但是 str实际保存的 0x111指向的还是之前的 aaa.
再具体的你搜下就知道了。。随便找个解释给你挂一下,
https://www.zhihu.com/question/31203609
第一次操作,你输出的就是str,当然是aaa。
第二次操作,把xxxyyy赋值给了a, 再输出a,所以结果是xxxyyy。
没毛病啊。
估计是作者理解不到位,建议卡看看JVM内存模型
@lzj123: 是的 理解没有到位,好的!
你的本意是第一次应该输出newStr,误写成str,test方法并未改变main方法的str值,因为test方法参数不是引用类型
你误会了我的本意
如果支持调试的话,学习下如何调试
不支持调试的话,多打印,多分析
谢谢
请将第一句输出改成: System.out.println(newStr);
为什么要改
把 String newStr = test(str);
改成 str = test(str);
String是引用类型,只是编译器对其做了特殊处理。
谢谢 是的 我就是要知道怎么做的处理
照这个逻辑,每次调用方法,我的参数都可能被修改?还要ref,out关键字干嘛?
out、ref关键字是什么鬼?小弟才疏学浅不知道java里还有这两个关键字
@杨筱斌: 尴尬。。。这个是C#里面的关键字,Java中替代C# ref/out 关键字方案
String属于值传递,所以调用test()方法后str的值未改变,第二次是直接在当前函数中操作赋值,值会改变
String是引用数据类型,但是java的设计者就是为了使用String就像使用基本数据类型一样,因此才有的这个设计,我现在要探究的就是为什么会这样