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.
对于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中的数据拷贝进去了。
1.这里确切的说是创建了两个堆实体, 一个是 "abc" 另一个是 new String(data) 因为String的池在这里没有作用
2.你说 char[] 是对象是错误的 根据面向对象语言的基本语法 类 引用 = new 类(); 你可以得到你想要的答案
另 你说的str 是对象是可以这么说的 因为String 比较特殊<在java语法中 C++ 或c#不了解>
你这一个问题包含了很多内容:
String str="abc";
和char data[] = "abc"; String str = new String(data);
是不完全一样的。前一句在常量区里存了"abc"之后,new一个String实例,再把"abc"复制到str中去;后者却是多了一个栈内的char数组做中转。当然,结果是一样的,而且编译器也可能存在优化,省去中转过程。