String s =" sometext"作品?

时间:2017-02-02 13:12:49

标签: java string oop

在面向对象语言中,新对象的创建是使用 new 关键字(因为java中的内存分配动态完成)。

即使String是一个类,如何在没有 new 关键字的情况下创建其对象?

即使它使用字符串池,我也无法清楚地理解它: "可以创建一个用户定义的类,我们可以直接初始化变量,如String"

2 个答案:

答案 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.Stringfinal类,完全是出于不可变性的原因(您可以通过将重复项指向单个实例来共享重复项)。