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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 我是庄子 中级黑马   /  2016-1-27 09:26  /  704 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

a:  String s1 ="abc";
b:   String s2 = new String("abc");

为什么a中s1指向内存中只有一个对象abc?
而b中s2指向的内容中有两个对象abc,new

4 个回复

倒序浏览
你看的应该黑马免费视频,毕向东的java基础教程吧,你可以看一下JDK API 里面关于String这个类里面有一个构造方法:String(String original)
下面有截图,你仔细理解一下文字介绍,说的意思应该是:String s2=new String("abc");   "abc"这个对象本身没有变,又重新new 出来一个abc,也就是现在有两个abc,也就是JDK API里面所说的副本。我觉得应该是这样理解的

QQ截图20160127110712.png (173.72 KB, 下载次数: 9)

QQ截图20160127110712.png

QQ截图20160127110358.png (160.3 KB, 下载次数: 11)

QQ截图20160127110358.png

评分

参与人数 1技术分 +1 收起 理由
洋葱头头 + 1 赞一个!

查看全部评分

回复 使用道具 举报 1 0
楼上正解,再补充
如果要解释的话

需要 解释 JAVA 中
                        常量池
                          栈
                          堆
回复 使用道具 举报
因为b中new一个新的对象abc
回复 使用道具 举报
"abc"是一个常量字符串对象,是存储在字符串常量池中的,且只有一个。
String s = "abc"中s是String类型的引用,指向在常量池中的字符串常量"abc",所以只有一个对象。

String s = new String("abc");首先通过new在堆中创建了一个String对象,并用s指向它。而"abc"则因是字符常量放在常量池中。所以有两个对象。另外这个构造函数的源码如下:
String是对一个字符串数组的封装,扩展其功能。String s = new String()实际上就是将"abc"中的内容copy给s所指向的字符串对象。

新建位图图像.jpg (146.62 KB, 下载次数: 12)

新建位图图像.jpg
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马