英语轻松读发新版了,欢迎下载、更新

String str =

alanbuild 发布于 2014年04月22日 | 更新于 2015年07月21日
无人欣赏。

有人说上面的语句只创建了一个对象,但我看了API: String str = "abc"; is equivalent to: char data[] = {'a', 'b', 'c'}; String str = new String(data); 这样子不是创建了两个对象吗?一个是char[],另一个是str吗? 迷惑,求解释。

共8条回复
tinyfool 回复于 2014年04月22日
  • char[]不是对象
  • 学东西不要太纠结小细节,先学进去,慢慢体会这些细节,而不是一开始就纠结在里面
小时候可帅啦 回复于 2014年04月24日

your char[] data is a variable created at stack, the String str is a String object created at heap

--- based on c++; check out new keyword.

byunting 回复于 2014年04月24日

String str = "abc" 应该是个语法糖。编译器会转换成 String str = new String("abc"); 这种形式吧。跟NSString str = @"abc" 一样

amosji 回复于 2014年04月24日

楼长说的对!

yellowb 回复于 2014年04月25日

对于String str = "abc"来说,如果你把char[]也看作对象的话,那的确是有2个对象:一个char[],一个String。 其实看看String的源码就知道里面有个属性:

/** The value is used for character storage. */
    private final char value[];

但是对于char data[] = {'a', 'b', 'c'}; String str = new String(data);来说,总共产生应该是有3个对象(2char[] + 1String),因为public String(char value[])最后会调用 Arrays.copyOf,也就是说创建了另一个新的char[]并且把data中的数据拷贝进去了。

Palm 回复于 2014年04月26日

1.这里确切的说是创建了两个堆实体, 一个是 "abc" 另一个是 new String(data) 因为String的池在这里没有作用
2.你说 char[] 是对象是错误的 根据面向对象语言的基本语法 类 引用 = new 类(); 你可以得到你想要的答案 另 你说的str 是对象是可以这么说的 因为String 比较特殊<在java语法中 C++ 或c#不了解>

玉楼 回复于 2014年04月26日

你这一个问题包含了很多内容:

  1. 你要理解什么是基本类型,什么是对象。cha[]就是基本类型,String类的实例str就是对象。
  2. 你使用Object-C就要知道内存的分配方式:堆、栈、全局/静态区、常量区和代码区。
  3. String str="abc";char data[] = "abc"; String str = new String(data);是不完全一样的。前一句在常量区里存了"abc"之后,new一个String实例,再把"abc"复制到str中去;后者却是多了一个栈内的char数组做中转。当然,结果是一样的,而且编译器也可能存在优化,省去中转过程。
大屌哥 回复于 2015年07月21日

小伙子,不要疑惑 下个Eclipse Bytecode 插件,一目了然

登录 或者 注册