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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Stringstr=new String("abc") 这行代码究竟创建了几个对象?
Stringstr=new String("abc");   紧接着这段代码之后的往往是这个问题,那就是这行代码究竟创建了几个String对象呢? 相信大家对这道题并不陌生,答案也是众所周知的,2个。 接下来我们就从这道题展开,一起回顾一下与创建String对象相关的一些JAVA知识。   我们可以把上面这行代码分成Stringstr、=、"abc"和new String()四部分来看待。S
String s=new String("abc") 创建了几个对象?
答案是2个,大家肯定都知道。面试中经常出现的问题,今天认真分析一下。 1、 Sting s    定义了一个变量s,没有创建对象; 2、 =    赋值,将某个对象的引用(句柄)赋给s ,没有创建对象; 3、 “abc”    创建一个对象; 4、 new String() 创建一个对象。 首先,总结一下java创建对象的方式:new、clone、反射、反序列化 再看一下 St
String str=new String("abc")到底创建了几个对象
String到底创建了几个对象的自己的理解。(字节码层面上)
String a="123"创建对象个数问题
String类型对象创建个数,我总结为一下几种情况(均不考虑字符串在常量池中已存在的情况): 1 String a="123"; 创建了1个对象 jvm在编译阶段会判断常量池中是否有 "123" 这个常量对象如果有,a直接指向这个常量的引用,如果没有会在常量池里创建这个常量对象。 2  String a=new String("123"); 创建了2个对象 同情况1,jvm编译阶段判断
Java中String str = new String("abc");创建了几个对象?
Java中String str = new String("abc");创建了几个对象?
String a=new String("abc")创建了几个对象
String str=new String("abc");   紧接着这段代码之后的往往是这个问题,那就是这行代码究竟创建了几个String对象呢? 相信大家对这道题并不陌生,答案也是众所周知的,2个。 接下来我们就从这道题展开,一起回顾一下与创建String对象相关的一些JAVA知识。   我们可以把上面这行代码分成String str、=、"abc"和new String()
String s1 = new String("abc");这句话创建了几个对象?
创建了两个对象: 常量池中有一个对象,在堆内存中也有一个对象,是复制过去的。s1的地址指向的是堆内存的地址。 可以看以下例子: String s1 = new String("abc");//堆内存的地值值 string s2 = "abc"; System.out.println(s1==s2); System.out.println(s1.equals(s2)); 输出的结果是
StringBuffer及String笔试题集锦
下面是相关的笔试题 1)以下创建了几个对象 (?) String A,B,C A="a"; B="b": A=A+B; StringBuffer D=new StringBuffer("abc"); D=D.append("567");     A. 3 B. 5 C. 4 D. 6   答案应该是6个,其中常量池是考点  StringBuffer类     Stri
new String("abc")和“abc”的区别
方式一:String a = “aaa” ; 方式二:String b = new String(“aaa”); 两种方式都能创建字符串对象,但方式一要比方式二更优。因为字符串是保存在常量池中的,而通过new创建的对象会存放在堆内存中。 一:常量池中已经有字符串常量”aaa” 通过方式一创建对象,程序运行时会在常量池中查找”aaa”字符串,将找到的”aaa”字符串的地址赋给
String str="abc" 与 String str = new String("abc")
1.java运行环境有一个字符串池,由String类维护,执行语句String str="abc"时: 1.首先查看字符串池中是否存在字符串"abc",如果存在则直接将“abc”赋给str,如果不存在则先在  字 符串池中新建一个字符串"abc",然后再将其赋给str. 2.执行语句String str = new String("abc");时。不管字符串池中是否存在字符串“abc”