黑马程序员技术交流社区

标题: 我对String s1="abc"和String s2=new String("abc")的理解 [打印本页]

作者: Nick_KJ    时间: 2015-4-6 14:52
标题: 我对String s1="abc"和String s2=new String("abc")的理解
刚刚非常悲催的写了这篇文章,发送时因为标题长而失败,结果内容清空……纯手打了半个小时:结果没了……程序员的惨痛经历很多人都有吧{:2_34:}。所以切记:保存!!! 言归正传。
发现论坛中好几个帖子在讨论这两行代码:
  1. String s1 = "abc";
  2. String s2 = new String("abc");
复制代码
视频中,毕老师讲这两行代码的区别是,第一行代码是生成一个对象;第二行是两个对象。这便是不同之处。
可也许还有疑惑:哪一个对象,哪两个对象,都在哪里呢?我的解答如下(如果大家发现问题,希望能及时指出):
第一行代码:
首先在 栈 中开辟一个空间存放一个 s1 引用。然后在java的方法区中的常量池开辟空间建立存放一个String类型的"abc"(假设之前常量池为空;因为如果之前有"abc"的话,就不会重新建立),引用 s1 指向池中的"abc",此时 s1 存放的是"abc"的地址。
第二行代码:
首先在 栈 中开辟一个空间存放一个 s2 引用。Java中,只要使用new关键字来创建对象,则一定会在堆区创建一个新的对象。然后,在堆中开辟空间建立了new String对象,这是一个对象;然后在堆中建立了一个对象"abc"并放入这个new String对象里面。一共两个对象。此时 s2 指向这个new String的堆地址。
接着看着两行代码:
  1. String st1 = "abc";
  2. System.out.println(st1 == "abc");
  3. String st2 = new String("abc");
  4. String.out.println(st2 == "abc");
  5. //输出结果 ture false
复制代码
我的理解如上。


作者: 黑色救护车    时间: 2015-4-6 18:35
就是这样滴~~~!:lol
作者: caotierong    时间: 2015-4-6 21:29
可以这样理解么?在创建s2这个对象的时候构造方法又创建了一个新的对象“abc”?
作者: Nick_KJ    时间: 2015-4-6 21:45
caotierong 发表于 2015-4-6 21:29
可以这样理解么?在创建s2这个对象的时候构造方法又创建了一个新的对象“abc”? ...

s2只是一个引用,不是一个对象,它指向对象的地址。我目前是这么理解的




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2