这个是原程序:
public class ForPractise {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("Hello "); System.out.println("Before change, sb = " + sb); changeData(sb); //将SB传入
System.out.println("After changeData(n), sb = " + sb); } public static void changeData(StringBuffer strBuf) { //传递引用 StringBuffer sb2 = new StringBuffer("Hi "); //建立另一个StringBuffer对象sb2 strBuf = sb2; //将sb2的引用地址(既指针)传给直接strBuf str未建立副本
sb2.append("World!"); //修改sb2的值 }}
输出的结果是:
Before change, sb = Hello
After changeData(n), sb = Hello 请高手解答下 调用changeData以后 为什么没有改变 sb的值呢? 如果我把changeData里的语句改为strBuf.append("world"); 则会输出
Before change, sb = Hello
After changeData(n), sb = Hello world
这是为什么呢? 为什么传引用在这里不起作用了呢?
public class ForPractise {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("Hello "); System.out.println("Before change, sb = " + sb); changeData(sb); //将SB传入
System.out.println("After changeData(n), sb = " + sb); } public static void changeData(StringBuffer strBuf) { //传递引用 StringBuffer sb2 = new StringBuffer("Hi "); //建立另一个StringBuffer对象sb2 strBuf = sb2; //将sb2的引用地址(既指针)传给直接strBuf str未建立副本
sb2.append("World!"); //修改sb2的值 }}
输出的结果是:
Before change, sb = Hello
After changeData(n), sb = Hello 请高手解答下 调用changeData以后 为什么没有改变 sb的值呢? 如果我把changeData里的语句改为strBuf.append("world"); 则会输出
Before change, sb = Hello
After changeData(n), sb = Hello world
这是为什么呢? 为什么传引用在这里不起作用了呢?
sb2.append("World!"); //修改sb2的值 } 改为: public static void changeData(StringBuffer strBuf) { //传递引用
strBuf .append("World!"); //修改sb2的值 }
局部变量把地址又换了个新的地址,原先的sb地址依然没有改变呀.
java只有值传递(对引用类型传的是地址的值)
public static void changeData(StringBuffer strBuf)
中,strBuf是局部变量,函数执行完毕,strBuf消失(在changeData执行的时候,开始sb与strBuf的值是
一样的,所以指向同一个对象,但在后来strBuf就重新赋值了,sb还是原来的)
所以对sb根本就没有什么影响
strBuf-->Hello
sb2--Hi
然后执行这句话结束时strBuf = sb2;
strBuf-->Hi
执行这句话结束时sb2.append("World!");
sb2-->HiWorld!, strBuf-->HiWorld!, sb-->Hello
运行结果还是: Before change, sb = Hello
After changeData(n), sb = Hello
这是怎么回事呢?
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("Hello "); //假设此时sb中存储的是一个地址值,假设为1234, System.out.println("Before change, sb = " + sb); changeData(sb); //将SB传入 执行这个之后strBuf也存储了一个地址值1234,也就是说有了两存储地址值1234的地方,他们分别为sb和strBuf
System.out.println("After changeData(n), sb = " + sb); } public static void changeData(StringBuffer strBuf) { //传递引用 StringBuffer sb2 = new StringBuffer("Hi "); //建立另一个StringBuffer对象sb2假设此时sb2有地址值4321 strBuf = sb2; //将sb2的引用地址(既指针)传给直接strBuf str未建立副本 使得strBuf也有了地址值4321,这是此程序的错误地方,这时候sb值是1234,而sb2和strBuf的值是4321。从此开始你对strBuf进行任何操作都和sb没有关系了。
sb2.append("World!"); //修改sb2的值 } }