在面向对象语言中,新对象的创建是使用 new 关键字(因为java中的内存分配动态完成)。
即使String是一个类,如何在没有 new 关键字的情况下创建其对象?
即使它使用字符串池,我也无法清楚地理解它: "可以创建一个用户定义的类,我们可以直接初始化变量,如String"
答案 0 :(得分:5)
使用字符串文字创建String
对象的机制内置于编译器和JVM中。它不适用于用户定义类型的对象。
第一次写作时
String s = "sometext";
编译器发出两件事:
"sometext"
的{{3}}条目,s
设置为引用常量表中的条目的指令。如果你写
String t = "sometext";
在同一个类中,编译器将重用"sometext"
的现有常量,而不是创建一个新常量。
在运行时,JVM为常量表中的每个条目创建一个新的String
对象,并为您的程序提供访问它们的权限。从本质上讲,JVM代表您的程序调用{{1}},并将其交给即用型对象。
当您使用自动装箱创建原始包装器的实例时,类似的系统正在发挥作用。但是,常见的是它需要编译器的支持,并且不适用于用户定义的类型。
答案 1 :(得分:0)
在Java中,字符串是不可变的并且可以选择合并(" interned")。
"sometext"
只是来自静态池的String
的实例。
您无法创建用户定义的字符串,因为java.lang.String
是final
类,完全是出于不可变性的原因(您可以通过将重复项指向单个实例来共享重复项)。