public class Test {
public static StringBuffer doSomething(StringBuffer buff) {
buff = new StringBuffer();
buff.append("Hello World");
return buff;
}
public static void main(String[] args) {
StringBuffer buff = new StringBuffer();
buff.append("Hello");
doSomething(buff);
System.out.println(buff);
}
}
public static StringBuffer doSomething(StringBuffer buff) {
buff = new StringBuffer();
buff.append("Hello World");
return buff;
}
public static void main(String[] args) {
StringBuffer buff = new StringBuffer();
buff.append("Hello");
doSomething(buff);
System.out.println(buff);
}
}
doSomething(buff); 改成 buff = doSomething(buff);
public static StringBuffer doSomething(StringBuffer buff) {
//2 看这里你又重新生成了一个StringBuffer.
buff = new StringBuffer();
buff.append("Hello World");
return buff;
}
public static void main(String[] args) {
StringBuffer buff = new StringBuffer();
buff.append("Hello");
// 1,你着里传的是 buff对象
doSomething(buff);
// 你输出的事实上是main中的 buff 所以是 Hello
System.out.println(buff);
}
} 修改一下你就可以输出Hello World 了 public static void main(String[] args) {
StringBuffer buff = new StringBuffer();
buff.append("Hello");
buff= doSomething(buff);
//这时你就可以输出Hello World 了。
System.out.println(buff);
}
public class Test {
public static StringBuffer doSomething(StringBuffer buff) {
buff = new StringBuffer(); //buff重新指向另一个对象,
buff.append("Hello World"); //对其进行修改!
return buff; //返回这个新对象!
}
public static void main(String[] args) {
StringBuffer buff = new StringBuffer();
buff.append("Hello"); //这里 buff.toString()为"hello"
doSomething(buff); 这里copy一个buff的引用传给doSomething()的引数buff1,
//上面方法回来之后buff还是指向原来的地址,而不是在方法内部重新指向的那对象
System.out.println(buff); //所以内容没改变
}
}
public class test6 {
public static StringBuffer doSomething(StringBuffer buff) {
buff = new StringBuffer();
buff.append("Hello World");
return buff;
}
public static void main(String[] args) {
StringBuffer buff = new StringBuffer();
buff.append("Hello");
//doSomething(buff);
System.out.println(doSomething(buff));
} }
这样才可以输出你想要的“Hello World”,
所以你输出的还是main方法里面的那个StringBuffer的实列,要输出"Hello Word"的话,
你只要用StringBuffer buff1 =doSomething(buff)在输出System.out.println(buff1)就行了
public class HelloJava {
public static StringBuffer doSomething(StringBuffer buff) {
//这个buff实际上就是一个局部变量,
//在调用doSomething(bf);的时候就相当于先做了buff = bf;这个操作
buff = new StringBuffer();//这里又将buff重新赋值,这时buff和bf无任何关系
buff.append("Hello World");
return buff;
} public static void main(String[] args) {
StringBuffer bf = new StringBuffer();
bf.append("Hello");
doSomething(bf);
System.out.println(bf);
}
}
buff = doSomething(buff);
否则就把buff 定义成全局的
public static StringBuffer doSomething(StringBuffer buff) {
//传过StringBuffer以后 你又new 了一个新的对象
// buff = new StringBuffer();
buff.append("Hello World");
return buff;
}
public static void main(String[] args) {
StringBuffer buff = new StringBuffer();
buff.append("Hello");
System.out.println(buff); //结果 Hello
//doSomething 返回的是 StringBuffer 你没有把返回值 打印 呢
buff = doSomething(buff);
System.out.println(buff); //这样结果就是 HelloHello World 了啊,是两次的追加了
}
}
所以doSomething这个方法实际上并没有改变原来那个对象的值
没有做任何改变buff的工作,所以有与没有一个样。
而上边的那个方法中的是令外一个局部变量··
public static StringBuffer doSomething(StringBuffer buff) {
buff.append("Hello World");
return buff;
}
public static void main(String[] args) {
StringBuffer buff = new StringBuffer();
buff.append("Hello");
doSomething(buff);
System.out.println(buff);
}
}
或者
public class Test {
public static StringBuffer doSomething(StringBuffer buff) {
buff = new StringBuffer();
buff.append("Hello World");
return buff;
}
public static void main(String[] args) {
StringBuffer buff = new StringBuffer();
buff.append("Hello");
buff = doSomething(buff);
System.out.println(buff);
}
}
以我的想法就是,分析内存,从main()开始,首先是程序加载到code segment 中,
首先为static 变量创建对象和分配内存空间,如图 Data segment 主要是存放 静态变量和字符串和常量,
创建了一个StringBuffer buff分配在栈内存中 就是我给出的图片中的 stack 区, 然后 new StringBuffer();对象,在堆内存中,如图 heap 区. buff调用append方法传 "Hello"进来 , doSomething(buff);//调用doSomething 方法传一个StringBuffer 类型 参数为buff 进入 doSomething方法体,new 一新 StringBuffer对象并且调用 append方法,值为 "Hello World",return buff;反大括号,局部变量消失,也就是说 doSomething 方法体内的 buff对象消失.
最后print main 方法中的 buff对象的值。=======
个人观点,不对的地方还得请大家指出来。