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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

String s = new String("xyz");创建了几个对象?

13 个回复

倒序浏览
两个,一个是s ,一个是xyz
回复 使用道具 举报
确却的说一个是引用  一个是对象 ,对象指向引用 , 否则new String("xyz") 就是个匿名对象
回复 使用道具 举报
2个对象哦
回复 使用道具 举报
一个是new String() 一个是“xyz”
回复 使用道具 举报
两个对象 等号左右各是一个
回复 使用道具 举报
我觉得你要结合你的代码上下文来看这个问题:
1.如果你的代码之前有声明过“xyz”,如String s = "xyz";那么你这段代码只声明了一个对象;
2.如果你的代码之前没有声明过“xyz”,则这段代码声明了两个对象;
原理:“xyz”作为一个值,按照java中的机制,这个值会存放在栈内存中,当其他变量再声明数值为“xyz”时,则会直接将栈内存中“xyz”的引用传递过去。
而String s = new String("xyz");这里声明一个String类型的变量,变量中的值为“xyz”,实际上变量s是存在于堆内存中的。这里new出的String类型的变量,变量中的值指向栈内存中的“xyz”
回复 使用道具 举报
两个对象,一个引用变量
回复 使用道具 举报
String a1="java";
String a2="java";
a1==a2;//结果为true,其实a1和a2是同一个数据
String b1=new String("java");
String b2=new String("java");
b1==b2//结果为false,b1和b2是两个对象

和还有一个帖子的内容差不多,
1、String s="java"; 这里产生得到一个字符串常量。系统首先会去“常量池”寻找,看是否有“java”常量存在,如果有那么就将这个常量“java”赋给s,如果没有则系统在常量池里创建“java”,并将其给s。

2、String s = new String("java"); 意思是根据常量“java”创建一个字符串的对象,如此他首先会执行1中的操作,然后根据常量“java”在堆中创建对象,并为其分配内存。

就是说无论如何,都会有两个对象,当然,还有一个引用变量
回复 使用道具 举报
结合代码来看,一个是对象一个是引用变量
回复 使用道具 举报
new运算了了,在内存上创建string对象,并将其返回给s,又一个对象,共两个对象
回复 使用道具 举报
liaorubei 发表于 2014-9-5 16:08
String a1="java";
String a2="java";
a1==a2;//结果为true,其实a1和a2是同一个数据

那么这两个在堆中的String对象,是各保存一份"java"的值呢?还是保存的同一个对常量池中"java"的引用呢?
回复 使用道具 举报
创建的对象应该是两个,  
String s = new String("xyz");

String类比较特殊     会先在常量池里查看 如果有"xyz"  就不会再创建  而你的代码明显是没有,所以是会创建一个,
然后new   就要在堆内存中创建一个对象,     但是是常量池中的"xyz"创建的副本   
String 类包括的方法可用于检查序列的单个字符、比较字符串、搜索字符串、提取子字符串、创建字符串副本并将所有字符全部转换为大写或小写
String(String original)
          初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本。

所以是两个

回复 使用道具 举报
本帖最后由 liaohongjie 于 2014-9-5 20:59 编辑

一个对象啊,“xyz”只是传递给构造函数的,String构造方法String(String  value),字符串参数指定字符串的内容
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马