各位大虾们:
如上所述,String str=new String("abc");创建了两个String类的对象(1:new String()所创建,2:“abc”通过Class类中的newInstance所创建===》不知理解是否有错?)。
问题如下:在堆和栈中不知道是如何对应的,str、new String 、"abc"如何对应,求解,有图为最好!
另外插一句,变量str放在堆和栈里与是否是合局变量有关系?是全局的就是在栈里面,局部的就在堆里面?
如上所述,String str=new String("abc");创建了两个String类的对象(1:new String()所创建,2:“abc”通过Class类中的newInstance所创建===》不知理解是否有错?)。
问题如下:在堆和栈中不知道是如何对应的,str、new String 、"abc"如何对应,求解,有图为最好!
另外插一句,变量str放在堆和栈里与是否是合局变量有关系?是全局的就是在栈里面,局部的就在堆里面?
①String str = "abc" 这个只会创建一个对象。其首先检查字符串池(String Pool)里有没有该字符串,如果没有就创建这样一个字符串常量,同时将指向该对象的引用赋给str。如果String Pool里已经有这个字符串常量了,则以后都会将String Pool里指向该常量的引用赋值给 变量名,比如 str。
②String str = new String("abc") 这个会创建两个对象。首先其也会去检查字符串池(String Pool)里有没有该字符串,如果没有就创建这样一个字符串常量,然后再去内存堆里面创建一个 "abc"的字符串对象,同时将内存堆里的这个对象的引用返回给变量名str。如果String Pool里已经有这个字符串常量了,则不会再在String Pool里创建一个这样的字符串,这时,仍然会去内存堆里创建一个"abc"的字符串对象,然后将指向该对象的引用返回给变量名str。
1:是String Pool是存在哪个地方的,堆和栈?哪一个,还是其它的?
2:对象的引用是和NEW 出来的一起放在堆里的吗?
3:String str=new String("abc");第一次创建的是一个什么(new String()?还是“abc”),放在堆里面?那第一次创建的和第二次创建的对象是怎么联连起来的? 呵呵,对这些问题一直不太明白,希望各位大虾能耐心解答。小弟在此感谢了!