Java中String的变量为什么不是String对象

如,Stringa="SS";那么a是String类的对象吗?1为什么我去寻求答案的时候,有人说a只是引用变量,不是对象,可是String是个类啊,a为什么不是Strin... 如,String a="SS";那么a是String类的对象吗?
1为什么我去寻求答案的时候,有人说a只是引用变量,不是对象,可是String是个类啊,a为什么不是String类的对象呢?
2为什么a不需要实例化就可以直接使用呢?
展开
 我来答
百度网友fe6d0b6
2013-12-19 · TA获得超过275个赞
知道小有建树答主
回答量:397
采纳率:75%
帮助的人:270万
展开全部
比较懒,即网上复制一段给你吧,这个比我自己将要详细很多。
字符串类(java.lang.String)是Java中使用最多的类,也是最为特殊的一个类,很多时候,我们对它既熟悉又陌生。一、从根本上认识java.lang.String类和String池首先,我建议先看看String类的源码实现,这是从本质上认识String类的根本出发点。从中可以看到:1、String类是final的,不可被继承。public final class String。2、String类是的本质是字符数组char[], 并且其值不可改变。PRivate final char value[];然后打开String类的API文档,可以发现:3、String类对象有个特殊的创建的方式,就是直接指定比如String x = "abc","abc"就表示一个字符串对象。而x是"abc"对象的地址,也叫做"abc"对象的引用。4、String对象可以通过“+”串联。串联后会生成新的字符串。也可以通过concat()来串联,这个后面会讲述。6、Java运行时会维护一个String Pool(String池),JavaDoc翻译很模糊“字符串缓冲区”。String池用来存放运行时中产生的各种字符串,并且池中的字符串的内容不重复。而一般对象不存在这个缓冲池,并且创建的对象仅仅存在于方法的堆栈区。5、创建字符串的方式很多,归纳起来有三类:其一,使用new关键字创建字符串,比如String s1 = new String("abc");其二,直接指定。比如String s2 = "abc";其三,使用串联生成新的字符串。比如String s3 = "ab" + "c"; 二、String对象的创建String对象的创建也很讲究,关键是要明白其原理。原理1:当使用任何方式来创建一个字符串对象s时,Java运行时(运行中JVM)会拿着这个X在String池中找是否存在内容相同的字符串对象,如果不存在,则在池中创建一个字符串s,否则,不在池中添加。原理2:Java中,只要使用new关键字来创建对象,则一定会(在堆区或栈区)创建一个新的对象。原理3:使用直接指定或者使用纯字符串串联来创建String对象,则仅仅会检查维护String池中的字符串,池中没有就在池中创建一个,有则罢了!但绝不会在堆栈区再去创建该String对象。原理4:使用包含变量的表达式来创建String对象,则不仅会检查维护String池,而且还会在堆栈区创建一个String对象。另外,String的intern()方法是一个本地方法,定义为public native String intern(); intern()方法的价值在于让开发者能将注意力集中到String池上。当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并且返回此 String 对象的引用。三、不可变类不可改变的字符串具有一个很大的优点:编译器可以把字符串设置为共享。 不可变类String有一个重要的优点-它们不会被共享引用。是这样的,JAVA为了提高效率,所以对于String类型进行了特别的处理---为string类型提供了串池 定义一个string类型的变量有两种方式: string name= "tom "; string name =new string( "tom ") 使用第一种方式的时候,就使用了串池, 使用第二中方式的时候,就是一种普通的声明对象的方式 如果你使用了第一种方式,那么当你在声明一个内容也是 "tom "的string时,它将使用串池里原来的那个内存,而不会重新分配内存,也就是说,string saname= "tom ",将会指向同一块内存 另外关于string类型是不可改变的问题: string类型是不可改变的,也就是说,当你想改变一个string对象的时候,比如name= "madding " 那么虚拟机不会改变原来的对象,而是生成一个新的string对象,然后让name去指向它,如果原来的那个 "tom "没有任何对象去引用它,虚拟机的垃圾回收机制将接收它。 据说这样可以提高效率!!!

最后总结下,String是一个很特殊的类,它有一个字符串池。
小狂中E
推荐于2017-10-13 · TA获得超过1418个赞
知道大有可为答主
回答量:1514
采纳率:66%
帮助的人:1033万
展开全部
从java语言使用层面上说a就是一个String对象,这可以通过 a instanceof String来判断
从jvm实现层面上说,真正的对象是"SS",它存放在堆里,a是指向"SS"的地址,是个栈上变量
a不需要实例化直接使用那是a未初始化时是null
追问
谢谢你哈,回答得真经典,如果从jvm实现层面上来说,真正的对象是“SS”,那么"SS"是存放在字符串池中的吗?还是存放在堆中的呢?堆和字符串池是在同一个内存中不同的区域吗?
追答
你说的没说,我忘了,"SS"是常量,应该是常量池中,而不是堆中,new String("SS")才会在堆中
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式