黑马程序员技术交流社区

标题: 关于String类对象实例化的问题 [打印本页]

作者: 郭振    时间: 2012-5-5 13:18
标题: 关于String类对象实例化的问题
本帖最后由 郭振 于 2012-5-5 13:21 编辑

//Srting类的对象一旦创建就不能改变,我对这个理解还是模糊不清楚。我怎么想也想不通,为什么结果不是“hello”而是“java”,我创建了一个sb对象,调用fun方法,结果应该是hello啊,希望大家能指点一下,在此谢了。

public class StringTest {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
               
       String s="java";
       fun(s);
       System.out.println(s);
        }
        
        public static void fun(String sb)
        {
                sb="hello";
        }

}
作者: 刘峰    时间: 2012-5-5 13:46
好好看看视频吧
作者: 云惟桉    时间: 2012-5-5 13:47
楼主这样用fun进行赋值,只是改变了变量s的引用,即地址,并没有改变实体对象的值。
String类型的对象"java"和"hello",在进行赋值的时候就在堆内存中创建无法修改,已经占有一部分内存,只能在某个时刻被jvm被垃圾回收。

作者: 龚振 龚振 龚振    时间: 2012-5-5 13:47
调用fun()方法后,你只是改变了变量s的引用,所以打印结果为hello

        但是最开始的那个对象"java"还是那个"java",只是你打印的这个变量s现在没有指向它而已,它本身依然存在,是它自己
作者: 倪杭乘    时间: 2012-5-5 13:52
这个问题跟字符串无关
fun(s);运行,压栈弹栈之后没有留下任何影响
fun(s) 只是将fun()方法中的sb赋值为“hello”
打印的s还是主函数中的s
作者: 崔仁军    时间: 2012-5-5 15:16
1  首先你要明白 在 Java 中进行方法的参数传递时,无论传递的是原生数据类型还是引用类型,参数传递方式统一是传值(pass by value )。Java  中没有传引用(pass by reference)的概念。所以你的程序改变的只是你穿进去的引用    本身并没有变而你打印的又是本身的那个引用所以值没变   如果你想打印出 hello  修改代码如下
public class StringTest
{               
       public static void main(String[] args)
       {
                 
                       String s="java";
                       String str = fun(s);
                       System.out.println(str);
       }
         
       public static String fun(String s)
       {
            return s="hello";
       }

}
作者: 徐慧书    时间: 2012-5-5 17:41
当 s = "java"
的时候就已经明确了打印的是java ,
只要你不对 s 重新赋值,那么它永远指向的都是串"java" ,
其实,字符串常量,常量嘛, String 他的值是不能够改变的,其实当我们平时运算 比如 s = s + “yes” 这里并不是改变 原来“java” 而是在字符串池中重新分配一块内存空间将"java"拷贝到其中在添加"yes" 然后把这个地址重新返回给s 。
所以啊,还是再仔细看看String 的基础知识吧,很快你就会很懂滴!
作者: 谭景宾    时间: 2012-5-5 18:06
你定义了String s="java",当以调用fun方法并将S传入的时候,实际上是在内存中又开辟了一个sb=“hello”空间,
那么这个时候内存中有两个String数据,一个是s="java",一个是sb="hello".
而你打印的是s
作者: 黑马张立国    时间: 2012-5-5 18:31
Srting类的对象一旦创建就不能改变
上面的例子可以这样理解:
String  s = new String("abc");
s这个引用可以改变  如:  s = asd;
而new String("abc")这个被s引用的对象不能改(即不能在对象内部改其属性)
而你所认为的改,是重新new了一个对象,并把改对象的引用赋给了引用变量
刚开始学的时候我也有这个疑问,后来解决了,祝你学习愉快,加油兄弟。
作者: 郭振    时间: 2012-5-5 18:41
呵呵,哦,这会我知道是怎么回事了。
作者: 隋营营    时间: 2012-5-5 18:49
本帖最后由 隋营营 于 2012-5-5 18:50 编辑

main在调用fun时只是在栈内存为变量sb分配了一块空间,fun中将sb的引用指向了"hello"
fun调用完成后变量sb的内存空间被释放,所以输出的s的值仍然是"java"
请看图解:

2012-05-05_184116.png (10.66 KB, 下载次数: 19)

内存分配图解

内存分配图解





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2