2 qq 32061971 qq_32061971 于 2016.02.19 19:06 提问

String a="abc";这个是对象吗?

有人说只有new出来的存在堆内存才是对象,
String a=new String("abc")

5个回答

wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.02.19 22:02

首先,String a="abc";这句代码做了两件事情,第一,在栈中定义了一个引用变量a;第二,代码编译期间在常量池中存储了“abc"这个常量串,并将这个引用变量指向常量池中的这个常量地址。不应该问这是不是一个对象,而应该问这个对象的内容是存储在哪里,本地方法区(即常量池中的数据存储的位置),还是堆内存中(动态创建的对象)?答案是,这个对象"abc"是存储在本地方法区中。
其次,String a=new String("abc")这个代码创建了2个对象,new操作在堆内存中创建了一个对象,对象的引用赋给变量a,而这个对象的值又指向常量池中值为"abc"的这个对象。
其实,只要是非java的8大基础类型以外的变量都是引用类型,即我们通常说的对象类型。这是个老生常谈的问题,只要稍微了解下JVM的底层知识,就不难理解了。

caozhy
caozhy 很详细,很赞
接近 2 年之前 回复
moran_sky
moran_sky   2016.02.19 19:17

“abc”是一个对象,a是一个引用

oyljerry
oyljerry   Ds   Rxr 2016.02.19 21:44

一样是对象 堆 堆栈 都是对象 只是生存期不同

luochoudan
luochoudan   Ds   Rxr 2016.02.19 22:35

肯定是对象无疑,毕老师的回答很详细。

qq_29427235
qq_29427235   2016.02.20 17:23

是对象,直接赋值和new出来的区别就在于,new出来肯定会新建一个对象,但是直接赋值的会先在常量池中查找,要是有这个常量,那么直接将地址指向引用,没有的话才新建

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!