/** Creates a new instance of Test */
public A() {
StringBuffer sb1 = new StringBuffer("sb1");
StringBuffer sb2 = new StringBuffer("sb2");
myfunction(sb1,sb2);
System.out.println(sb1+","+sb2);
}
public void myfunction(StringBuffer a,StringBuffer b){
a.append(b);
a = b;
System.out.println(a.toString());
}
public static void main(String[] args) {
new A();
}
}
求牛人分析, ------解决方案--------------------
a = b;
这一行有没有不会影响main方法中的sb1,sb2;
你先看一下StringBuffer,a.append(b)没有生成新的对象,是在原对象的基础上进行操作的; ------解决方案-------------------- public A 是A类的构造函数,你每次new A() 的时候都会调用构造函数,即调用public A(),构造函数里面你定义了2个StringBuffer,然后做了一个连接字符串的操作,最终得到你的结果。这里面楼主主要得知道对象的引用,这里面定义了两个对象,四个引用,sb1,a引用指向对象值“sb1”;sb2,b引用指向对象值“sb2”,当执行myfunction()方法时,将sb2的值追加到了sb1的值上,所以这时候的sb1,a引用指向对象值就是“sb1sb2”;sb2,b引用指向对象值仍然是“sb2”,当执行到a = b 时,把引用a指向了对象值为“sb2”的对象,所以打印a.toString()结果应该是“sb2”,但是sb1和sb2 引用的指向一直都没变,所以结果楼主所示。 ------解决方案-------------------- jvm 一个指向一个存值。 ------解决方案--------------------
考察对象引用:
public class A {
/** Creates a new instance of Test */
public A() {
StringBuffer sb1 = new StringBuffer("sb1");
StringBuffer sb2 = new StringBuffer("sb2");
myfunction(sb1,sb2);
System.out.println(sb1+","+sb2);
}
public void myfunction(StringBuffer a,StringBuffer b){
a.append(b);
a = b;
System.out.println(a.toString());
}
public static void main(String[] args) {
new A();
}
}
/** Creates a new instance of Test */
public A() {
// StringBuffer sb1 = new StringBuffer("sb1");
// StringBuffer sb2 = new StringBuffer("sb2");
String sb1 = "sb1";
String sb2 = "sb2";
myfunction(sb1,sb2);
System.out.println(sb1+","+sb2);
}
// public void myfunction(StringBuffer a,StringBuffer b){
// a.append(b);
// a = b;
// System.out.println(a.toString());
// }
public void myfunction(String a,String b){
a = a + b ;
a = b;
System.out.println(a.toString());
}
public static void main(String[] args) {