首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • java strgin类赋值疑问 [已结贴,结贴人:lbst03]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lbst03
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 揭贴率:
    发表于:2008-08-24 07:48:34 楼主
    最近在看孙鑫老师的java视频,受益匪浅。
    有一个引用问题不大懂

    public class pt
    {
    public static void main(String [] args)
    {
      String str1="hello";
      String str2=str1;  //string作为引用类型,赋值的时候赋予的是引用
      System.out.println("str1="+str1+" str2="+str2);
      str2="world";    //为什么此处没能改变str1的值?按照孙老师的意思,由于string是常量类型。那么为什么此处赋值未报错??
      System.out.println("str1="+str1+" str2="+str2);  //没有改变str1的值
     
    }
    }

    为什么此处没能改变str1的值?由于string是常量类型。那么为什么此处赋值未报错??谢谢
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zishizhilong
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 07:52:451楼 得分:20
    String 是对象,怎么会是常量呢?

    只是这个对象声明起来很简单:"world"; 就声明了一个。

    str2="world";把这个对象赋给str2引用,和str1自然没有关系。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zishizhilong
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 07:53:342楼 得分:0
    孙老师可能是帮助你理解,但String绝对是对象,不是常量的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lbst03
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 08:01:093楼 得分:0
    孙老师也是说是对象。string类对象是一个常量对象

    请问str1=str2,按照对象的赋值,就是复制了地址


    str2="world" 就是让这个地址中的值改变为world?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • pzy123cn
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 08:43:424楼 得分:0
    java对String类的处理很特别 ,他会自动把"hello" 和"world"放到内存的共享区域中 ,然后在程序中所有使用这两个字符串的String类分别指向不同的索引
    String str2 ;
    str2 = "World" ; //在内存中创建world,并把它的引用传递给str2
    String str1 = str2 ; //把str1的引用也传递到内存中的world,

    if(str1 == str2)
    {
            //通过上面两句话 就是说str1,和str2都只是共享内存中World这个对象的一个引用,所以他们相等
    System.out.println("HH");
    }
    str2=new String("Hello");//同理 ,在这里内存有创建了一个新的对象Hello在共享内存区域 , 然后把这个对象的引用付给了str2
    System.out.println("Str2 = "+str2);
    if(str1 == str2)//这是str1的引用还是内存中的"World"而str2的引用已经变成对象"Hello"了,所以他们就不相等了
    {

    System.out.println("HH2");
    }
    System.out.println("Aftre str1 is :"+str1);
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • pzy123cn
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 08:45:475楼 得分:0
    简单点说,就是java为了节省内存 ,所以对string使用了特使的管理方法 ,就是创建共享对象 ,然后让所有的String类引用个子的字符串。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • WWWTYB
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 09:04:366楼 得分:0
    String:
    是对象不是原始类型.
    为不可变对象,一旦被创建,就不能修改它的值.
    对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.
    String 是final类,即不能被继承.

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lbst03
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 09:27:277楼 得分:0
    4楼说的很好。但不对吧

    str2=new String("Hello");//同理 ,在这里内存有创建了一个新的对象Hello在共享内存区域 , 然后把这个对象的引用付给了str2
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lbst03
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 09:29:458楼 得分:0
    str2=new String("Hello");//同理 ,在这里内存有创建了一个新的对象Hello在共享内存区域 , 然后把这个对象的引用付给了str2----new创建的不再共享区
    String str3="hello";  //这种方式创建的才在共享区
    System.out.println(str2==str3);//打印出flase
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • pzy123cn
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 18:21:109楼 得分:0
    Hello != hello
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved