日期:2014-05-20  浏览次数:20721 次

麻烦给分析一下这道题

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(); 
     } 


求牛人分析,
------解决方案--------------------
引用:
Quote: 引用:

运行了,结果:
sb2
sb1sb2,sb2

分析一下结果  为什么是  sb1sb2,sb2

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  一个指向一个存值。
------解决方案--------------------
引用:
Quote: 引用:

考察对象引用:


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(); 
     } 


求牛人分析,


在构造函数里,创建了两个对象
sb1和sb2,请注意,这里是对象
myfunction是A对象的方法,参数是两个对象,因此当构造函数调用的时候,传的是这两个对象引用的副本
相当于C指针的副本,指针是个什么东西?指针是地址啊,它存的是对象实际内容的地址呀

myfunction是对a(实际操作的是sb1的内容)追加b
然后又让a指向b(a =b)(这里请把Java对象的引用当成指针来看待,但不能完全当成,这里是不会有内存泄漏的问题)
前边说过,传的是引用的副本,也就是说sb1和a都是指向"sb1",然后通过方法把"sb1"变成了“sb1sb2”,这个方法再把a指向"sb2"
因此sb1这个对象内容变了,a的指向变了
于是有了这个结果

修改

把代码改成
public class 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) {