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

帮忙解释一下java值传递与引用传递
Java code
public static void main(String[] args)
    {
        StringBuffer  str1 = new StringBuffer("hello");
        test(str1);
        System.out.println("main  : " + str1);
    }
    public static void test(StringBuffer str)
    {
        StringBuffer tempStr = new StringBuffer(); 

        System.out.println("first : " + str);
        str = str.append(" world");
        System.out.println("second: " + str);
        str = tempStr;
        System.out.println("third : " + str);
    }



结果为:
first : hello
second: hello world
third :
main : hello world

后两个的打印结果是什么原因

------解决方案--------------------
Java code
 public static void test(StringBuffer str)
    {
        StringBuffer tempStr = new StringBuffer(); //构造一个tempStr的StringBuffer对象

        System.out.println("first : " + str);//输出str,没有问题,肯定是hello
        str = str.append(" world");//在hello后面连接" world",并重新赋值给str,所以str现在是"hello world"
        System.out.println("second: " + str); //输出"hello world"
        str = tempStr; //将str指向tempStr,注意这里的str直接赋值和前面append的区别,append
//能改变这个str对象,而str这个形式参数只是指向了tempStr空间,一旦方法结束,str还是原来的str,
//也就是append之后的那个str "hello world" 
        System.out.println("third : " + str);
    }

------解决方案--------------------
[code=Java][/code]
public static void main(String[] args)
{
StringBuffer str1 = new StringBuffer("hello");
test(str1);
System.out.println("main : " + str1);
}
public static void test(StringBuffer str)
{
StringBuffer tempStr = new StringBuffer(); 

System.out.println("first : " + str);
str = str.append(" world");
System.out.println("second: " + str);
str = tempStr;
System.out.println("third : " + str);
}
[code=Java][/code]
请记住Java中函数永远是值传递的。
StringBuffer str1 = new StringBuffer("hello");
在堆内存声明了一个StringBuffer实例,传入参数“hello”。test()方法调用时,str1在栈内存中的对象引用被赋值给局部变量str,此时str和str1指向堆内存中的同一个StringBuffer对象。
接着输出str(同str1),结果是:hello;
append()将world追加到str(str1)变量所指向的StringBuffer中。注意由于str1和str指向同一个Stringbuffer对象,所以str1的值被改变,结果是“hello world”。
System.out.println("second: " + str)的打印结果当然是:hello world。
str = tempStr;这句将使str变量指向tempStr在堆内存中申请的内容为空字符串的StringBuffer对象,其实就是一个tempstr的别名。此时System.out.println("third : " + str);当然是空了。
退出test()方法后,由于str1的内容已经改变为:"hello world"
所以main方法中的System.out.println("third : " + str);打印输出为:hello world。
------解决方案--------------------
探讨
引用:
引用:
确切的说是jvm对String进行了特殊处理,jvm中存在着一个字符串池,其中保存着很多String对象,并且可以被共享使用,因此它提高了效率。
引用:
wang12同学,java没有对String作特殊处理.


wang12。String类型是引用类型。只是由于它的不可变所以像做s=S+"a" 这样的操作时新生成了对象。而new String("a");时才有可能是直接在栈池里面拿。
我想说的观点s=s+"a";永远都是新生成了对象。个人猜测,欢迎拍砖



new String("a");时才有可能是直接在栈池里面拿。我对String共享池的理解也仅限于此。
至于s=s+"a";永远都是新生成了对象。如果能给于确切答案的话,还望不吝赐教。