A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郭振 中级黑马   /  2012-5-5 13:18  /  2849 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 郭振 于 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";
        }

}

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 加油··好好看视频,毕老师13天视频3分多.

查看全部评分

10 个回复

倒序浏览
好好看看视频吧
回复 使用道具 举报
楼主这样用fun进行赋值,只是改变了变量s的引用,即地址,并没有改变实体对象的值。
String类型的对象"java"和"hello",在进行赋值的时候就在堆内存中创建无法修改,已经占有一部分内存,只能在某个时刻被jvm被垃圾回收。
回复 使用道具 举报
调用fun()方法后,你只是改变了变量s的引用,所以打印结果为hello

        但是最开始的那个对象"java"还是那个"java",只是你打印的这个变量s现在没有指向它而已,它本身依然存在,是它自己
回复 使用道具 举报
这个问题跟字符串无关
fun(s);运行,压栈弹栈之后没有留下任何影响
fun(s) 只是将fun()方法中的sb赋值为“hello”
打印的s还是主函数中的s
回复 使用道具 举报
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";
       }

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

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

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

内存分配图解

内存分配图解

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 图文并茂 非常给力··

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马