class Test {
public String str = "0000000";
}
public class AA {
private void method1(Test test) {
test.str = "222222";

}
private void method2(Test test) {
test = new Test();
test.str = "3333333";

}
private void method3(String str) {
str = "55555555";
}
public void action() {

Test test = new Test();

test.str = "1111111";

method1(test);
System.out.println("method1 : "+test.str);

method2(test);
System.out.println("method2 : "+test.str);

// String str = "44444444";
// method3(str);
// System.out.println("method3 : "+str);
}
public static void main(String[] args) {
AA a = new AA();
a.action();

}
}为什么打印出来都是“222222”?

解决方案 »

  1.   

    test = new Test();
    产生一个新的对象,,跟你付给method2(Test test)的是二个对象所以值没有改变哦
      

  2.   


    private void method2(Test test) {//把test引用的值传递给method2方法,注意是按值传递的。
    test = new Test();//引用的值被改变,使得test指向另一个对象,原对象保持不变。
    test.str = "3333333";//另一个对象str内容改变,退出后,原对象的引用不变。
    }
      

  3.   

    method2(Test test)这里test作为对象test的地址副本,方法中改变了副本的指向。
    方法结束,副本消失,因此原来的test对象不会发生改变。
      

  4.   

    可以从内存的角度去理解。
    我们从这段程序编译执行的过程来看
    根据主函数我们知道其实就是调用AA类中的action()方法
    在action()方法中
    public void action() {

    Test test = new Test();//先先堆内存中存放一个  test的引用

    test.str = "1111111";//把 字符串"1111"存放到栈内存,然后把test引  用,指向他.

    method1(test);//把test引用作为一个参数传递过来,通过函数体从新把test引用指向"2222".
    System.out.println("method1 : "+test.str);//打印"2222"

    method2(test);/*为了区分我们把传过来的叫TestA,new产生的哪个叫TestB
     可以这样想:当testA参数传递过来的时候,执行里面的函数体,这时候method方法里面有新产生了一个对象testB他和testA虽然名字相同但在栈内存中存放的内存地址不同(对于这点可以得到验证在method1()和method2()中分别放置语句System.out.println(test);就知道了),并且他的引用指向堆内存中的"3333"字符串,而传过来的参数testA并没受任何影响还是指向“1111”。并且函数体内的testB也不会受到从外面传过来的testA的影响。可以在method2()方法中放置System.out.println(test.str);语句测试下,发现打印结果是"3333",(实际上我们可以把通过new Test()产生的一个对象的引用test想象成另外一个既把test改一个名字就可以啦。)。*/  ^o^ ^o^ ^o^ System.out.println("method2 : "+test.str);//打印“2222”

    // String str = "44444444";
    // method3(str);
    // System.out.println("method3 : "+str);
    }
      

  5.   


    修正一下!呵呵!   ^0^
    Test test = new Test();//先先栈内存中存放一个  test的引用

    test.str = "1111111";//把 字符串"1111"存放到堆内存,然后把test引  用,指向他.