当前位置: 代码迷 >> J2SE >> 帮忙解释一下java值传递与引用传递,该如何处理
  详细解决方案

帮忙解释一下java值传递与引用传递,该如何处理

热度:192   发布时间:2016-04-24 02:30:06.0
帮忙解释一下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";永远都是新生成了对象。如果能给于确切答案的话,还望不吝赐教。
  相关解决方案