第一个:求执行结果public class MyClass{
    static void aMethod(StringBuffer sf1,StringBuffer sf2{
        sf1.append(sf2);
        sf2 = sf1;
    }
    public static void main(String[] args){
        StringBuffer sf1 = new StringBuffer("A");
        StringBuffer sf2 = new StringBuffer("B");
        aMethod(sf1,sf2);
        System.out.println(sf1+":"+sf2);
    }
}
这个结果为啥是AB:B啊?第二个:求执行结果
class MySuper{
    int i = 10;
    MySuper(){
        print();
        i = 20;
    }
    void print(){
        System.out.println(i);
    }}class MySub extends MySuper{
    int j = 30;
    MySub(){
        print();
        j = 40;    }
    void print(){
        System.out.println(j);
   }
   public static void main(String[] args){
       System.out.print(new MySub().j);
  }
}
 这个结果为啥是03040啊?
 第三个:第三行生成的object在第几行执行后成为GC的对象?
public class MyClass{
    public StringBuffer aMethod(){
        StringBuffer sf = new StringBuffer("Hello");
        StringBuffer[] sf_arr = new StringBuffer[1];
        sf_arr[0] = sf;
        sf = null;
        sf_arr[0] = null;
        return sf;
    }
}答案为啥是第七行啊?

解决方案 »

  1.   

    1 吝啬的人
    2 问题太多
    3 我比你还吝啬第一题:对象和引用的区别
    第二题:自己Debug看看执行顺序吧
    第三题:sf_arr[0] = sf;  所以必须所有指向对象的引用全部释放才能被GC
      

  2.   

    第一题static void aMethod(StringBuffer sf1,StringBuffer sf2{ 
            sf1.append(sf2); 
            sf2 = sf1; //不要被这句迷惑,这句屁用没有。
     }第二题:这个有点麻烦了。涉及到初始化顺序的问题。
    结果分为三部分,0 30 40 ,第一个0是MySuper.print()产生的,那时i还没有赋值,第二个30是MySub.print()产生的,那时j的值是30,最后的40是main中的printf打出来的。第三题:
    看一楼老大的回复。
      

  3.   

    public class MyClass
    {
    StringBuffer sf1 = new StringBuffer(""); 
        StringBuffer sf2 = new StringBuffer("");
    private  void MyClass(String str1,String str2)
    {
    this.sf1 = new StringBuffer(str1); 
         this.sf2 = new StringBuffer(str2);
    }

    private void  aMethod(StringBuffer sf1,StringBuffer sf2)
        { 
    sf1.append(sf2); 
        sf2 = sf1; 
        this.sf1=sf1;
        this.sf2=sf2;

    public static void main(String[] args)
        {
    MyClass m=new MyClass();
    m.MyClass("A","B");
            m.aMethod(m.sf1,m.sf2); 
            System.out.println(m.sf1+":"+m.sf2);     
    }
    }
    把第一个程序改了一下,不知道是不是你想要的那个效果.运行结果:AB:AB
      

  4.   

    static void aMethod(StringBuffer sf1,StringBuffer sf2{
            sf1.append(sf2);
            sf2 = sf1;
     } 
    用debug可以看到当没有跳转到aMethod时,sf1的ID时19,sf2的ID时25,跳转到aMethod时,sf1的ID时19,sf2的ID时29,也就是说并没有对main函数中的sf2进行处理。
      

  5.   

    时间比较紧故先只解决第一个:注意StringBuffer与String不同,StringBuffer虽然也是处理字符串的类
    但他的赋值必须是通过new的方式,而不能像String那样因为他是基本的数据类型
      

  6.   

    第一个问题是因为 StringBuffer这个类型不是String 类型不具有字符串的不变性
     这句sf2 = sf1是无效的 因为main()函数中的两个对象传过去的是引用所以sf2没有改变也就是说在 aMethod(StringBuffer sf1,StringBuffer sf2)中的这两个变量获得是main函数传过来的引用
      

  7.   

    第一个是因为,没有return sf2,真正的sf2并没有改变.形参sf2只是一个临时变量
    第二个是,MySub  继承了MySuper,所以第一次输出时j 没有初始化,默认为0;
    最好用Debug看看执行顺序;
    第三个:看一楼的老大