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

有关StringBuffer的问题
public class Test {
     
    public int inc() {
        int x;
        try {
            x = 1;
            return x;
        } catch (Exception e) {
            x = 2;
            return x;
        } finally {
            x = 3;
        }
    }
     
    public StringBuffer inc(StringBuffer x) {
        try {
            x.append("1");
            x = new StringBuffer();// 如果在里面加参数例如这样new StringBuffer("5")结果就变了
            return x;
        } catch (Exception e) {
            x.append("2");
            return x;
        } finally {
            x.append("3");
            x = new StringBuffer("4");
              //这后面加return x;也会变
        }
    }
     
    public static void main(String[] args) {
        int x = new Test().inc();
        System.out.println(x);
        StringBuffer x1 = new StringBuffer(),x2 = new Test().inc(x1);
        System.out.println(x1);
        System.out.println(x2);
    }
}

问:new StringBuffer();是否是重新开辟了一块内存,在这单中x1,和x2的指向是否有变化?
stringbuffer

------解决方案--------------------
1、StringBuffer 第一次new 都会生成新的引用。因为x是形参变量,所以不会对原有地址里面的数据发生更改。
2、finally 关键字是在运行try里面的return 语句后才会被执行的,其实x = new StringBuffer("4");  x的值已经被更改了,但是因为try里面的return已经把值返回给主调程序,所以就算更改了也无法返回数值。
------解决方案--------------------
执行x2 = new Test().inc(x1);这句话时,对传入的x1进行了 x.append("1");操作x1该内存地址的对象值变为1;

之后,变量x指向发生变化,指向新地址,并将新地址对象进行返回: