public class b { String s="aaa";
StringBuffer sb=new StringBuffer("bbb");
void f(b b1, b b2) {
b1 = b2;
}

void f(String str){
s+=str;
}

void f(StringBuffer sb1){
sb.append(sb1);
sb1=sb;
} public static void main(String args[]) {
b t1 = new b();
System.out.println(t1);
b t2 = new b();
t1.f(t1, t2);
System.out.println(t1 + " " + t2);

t1.f("ccc");
System.out.println(t1.s);

StringBuffer sb=new StringBuffer("ddd");
t1.f(sb);
System.out.println(sb);
}
}
1、调用t1.f(t1, t2);后为什么t1,t2的地址值还是不同?
2、调用t1.f("ccc");后为什么字符串可以打印“aaaccc"?
3、调用t1.f(sb);后为什么打印sb仍然是”ddd"?

解决方案 »

  1.   

    1.实例化等于开辟内存地址
    2.因为s+=str; (s=s+"ccc"或s="aaa"+"ccc")
    3.这个问题要吧这三个问题串起来回答。因为一个是局部变量一个是全局变量。问题2输出的是全局变量的值,问题3输出的是局部变量的值。因为名字相同混淆了你的思维。现在做如下改动。
    改动1:public static void main(String args[]) {
    b t1 = new b();
    System.out.println(t1);
    b t2 = new b();
    t1.f(t1, t2);
    System.out.println(t1 + " " + t2); t1.f("ccc");
    System.out.println(t1.s); StringBuffer sbb = new StringBuffer("ddd");
    t1.f(sbb);
    System.out.println(sbb);
    }这回看,输出的是sbb而不是sb的值,如果还不明白,请看改动2
    改动2:public class b { static String s = "aaa";
    static StringBuffer sb = new StringBuffer("bbb"); void f(b b1, b b2) {
    b1 = b2;
    } void f(String str) {
    s += str;
    } void f(StringBuffer sb1) {
    sb.append(sb1);
    sb1 = sb;
    } public static void main(String args[]) {
    b t1 = new b();
    System.out.println(t1);
    b t2 = new b();
    t1.f(t1, t2);
    System.out.println(t1 + " " + t2); t1.f("ccc");
    System.out.println(t1.s); StringBuffer sbb = new StringBuffer("ddd");
    t1.f(sb);
    System.out.println(sb);
    }
    }发现什么不同了吗?这次才是输出全局的sb值
      

  2.   

    更正一下改动2代码,t1.f(sbb)而不是t1.(sb)
      

  3.   

    1、两个实例化对象,地址值永远不相同。开辟的内存空间2、s的初始值是“aaa”,调用方法后 s = "aaa" + "ccc" = "aaaccc"3、全局变量和局部变量问题
    public class Test {
    public static void main(String[] args) throws Throwable {
    // TODO Auto-generated method stub
       int i = 0;
       A a = new A();
       a.test(i);
       System.out.println("全局变量:i = " + i);
    }}class A {
    int j = 0;
       public void test(int i){
       j++;
       i = j;
       System.out.println("局部变量:i = " + i);
       }
    }
      

  4.   

    1.实例化了两次,所以地址不同了。
    2.定义了 String s = "aaa",t1.f("ccc");,相当于s= s + "ccc";
    3.在方法中当局部变量和全局变量相同时访问的是局部变量而不是全局变量!
      

  5.   

    1、t1、t2实例化两次没错,但是我在t1.f(t1, t2);中把t2的引用赋给t1了,但是打印出来t1、t2地址还是不同啊?又一问,为什么sb2没有变?我在f(sb1,sb2);明明将改变后的sb1引用赋给了sb2
    public class b { static void f(StringBuffer sb1,StringBuffer sb2){
    sb1.append(sb2);
    sb2=sb1;
    } public static void main(String args[]) {


    StringBuffer sb1=new StringBuffer("ddd");
    StringBuffer sb2=new StringBuffer("bbb");
    f(sb1,sb2);
    System.out.println(sb1+" "+sb2);
    }
    }
      

  6.   

    如果是全局变量和局部变量的问题,那调用t1.f("ccc");后为什么字符串可以打印“aaaccc"? 
      

  7.   

    所以在函数里的参数的改变,不影响原来的值我想你一定会问那为什么引用对应的对象改变就有效果呢我也顺便解释一下,比如a = new object();
    调用f(a)实际上先生成a的副本_a, _a指向那个new object();
    你在函数里改变_a是没用的,因为不会改变a的指向
    但是你如果改变_a指向的new object()就有效果了,因为a也指向new object()
      

  8.   

    第一个是作用域的问题~
    public class b { String s="aaa"; 
    StringBuffer sb=new StringBuffer("bbb"); 
    void f(b b1, b b2) { 
    b1 = b2; 
    } void f(String str){ 
    s+=str; 
    } void f(StringBuffer sb1){ 
    sb.append(sb1); 
    sb1=sb; 
    } public static void main(String args[]) { 
    b t1 = new b(); 
    System.out.println(t1); 
    b t2 = new b(); 
    t1.f(t1, t2); 
    System.out.println(t1 + " " + t2); 
    t1=t2;                                          //在这里用t1修改t2才能其到作用
    System.out.println(t1 + " " + t2); 
    }
      

  9.   

    就上楼上几位说的~~局部变量和全局变量的问题
    第1个和第3个都没有明确指向,所以引用的都是全局变量.
    你最好把别人给你改的程序都试试~你就能明白了
    public class b { String s="aaa"; 
    StringBuffer sb=new StringBuffer("bbb"); 
    void f(b b1, b b2) { 
    b1 = b2; 
    } void f(String str){ 
    s+=str; 
    } StringBuffer f(StringBuffer sb1){ 
    sb.append(sb1);
    sb1=sb;
    System.out.println(sb);
    return sb1;
    } public static void main(String args[]) { 
    b t1 = new b(); 
    System.out.println(t1); 
    b t2 = new b(); 
    t1.f(t1, t2); 
    System.out.println(t1 + " " + t2); 
    t1=t2;
    System.out.println(t1 + " " + t2); t1.f("ccc"); 
    System.out.println(t1.s); StringBuffer sb=new StringBuffer("ddd"); 
    t1.f(sb); 
    System.out.println(sb);
    System.out.println(t1.f(sb));


      

  10.   

    String s;String类型的变量不是不可变的吗,为什么在打印的时候会出现aaaccc呢,也没有重新定义变量啊
      

  11.   

    主要是形参,实参,局部变量,全局变量的关系,System.out.println(t1 + " " + t2);  这里的t1,t2是上面new出来的,而不是方法里的形参,所以地址肯定不同的,而System.out.println(t1.s);因为s+=“ccc”;所以现在s指向的是“aaaccc”其实现在内存中还有个“aaa”。System.out.println(sb); 这个sb就是main方法里面的sb,所以打印出来的就是ddd,如果想打印出全局的sb,那就要加上对象名或this