可以在没有= new Obj()的情况下实例化新对象吗?

时间:2017-12-06 06:26:30

标签: java

因此,String不是基本类型,而是类,对象的对象通常必须以Obj x = new Obj ();的形式创建。但是,可以通过说String x = "...";来创建字符串,这是首选方式,而不是String x = new String ("...");

所以我想知道为什么这个字符串是允许的,并且如果构造函数只需要一个参数,是否可以以类似的方式创建其他类的对象。

例如,如果一个类有一个只调用一个整数的构造函数,那么会说Obj x = 2;在语法上是正确的,因为它的对象名和参数仍然以与编写字符串相同的方式包含在内。

3 个答案:

答案 0 :(得分:3)

String是一个无法扩展的特殊final类。使用 new 关键字和文字创建字符串是不同的;

堆中有一个特殊的内存区域,仅用于名为 String Pool 的字符串。当您创建字符串文字时,jvm会搜索字符串池,如果字符串池中存在该字符串,那么如果您创建的字符串与添加到池中的字符串不匹配,则具有相同值的其他字符串将与对象也是。

如果您使用 new 关键字创建一个字符串,则确保字符串是内存中的新对象,无论如何。

所以String是一种特殊的对象,不能与其他对象分类。

这是一篇文章

What is String Pool

答案 1 :(得分:2)

  

所以String不是原始类型,而是类,类的对象必须以Obj x = new Obj()形式创建;通常。但是,可以通过说String x =“...”来创建字符串;这是首选的方式,而不是String x = new String(“...”);

这是正确的,使用new String(String)通常是错误的。由于Strings是这样一种常见类型的值来创建,因此Java与大多数语言一样,具有string literal语法结构。在求值时,字符串文字表达式返回表示文本的字符串实例。

调用String y = new String("...")大致相当于String x = "..."; String y = new String(x);:字符串文字计算为字符串,然后提供给返回新字符串实例的String构造函数(虽然using the same backing character array to avoid copying data) - 这样的浪费!因此,new String(String)构造函数应该“永远”不应该被调用,除了希望做一些特殊的事情。 string interning

  

所以我想知道为什么这个字符串是允许的,如果构造函数只需要一个参数,就可以以类似的方式创建其他类的对象。

Java语法和大多数其他语言的一个特殊方面是创建字符串对象,而且操作简单。必须使用其他值创建字符串非常烦人new String(new char[] {'n','o',' ','t','h','a','n','k','s'})

Java 不支持自定义解析,因此无法将此行为扩展到Java本身的自定义类型。字符串文字的语法(以及执行期间的行为)包含在Java Language Specification

从字符串文字中创建字符串对象主要是“JVM魔术/实现细节”(从文字do not call the new String(String) constructor创建字符串,然后,如何创建原始字符串实例?)。此外,从评估字符串文字返回的字符串对象实例不保证每个字符串实习规则是唯一的/“新”。

  

例如,如果一个类有一个只调用一个整数的构造函数,则会说Obj x = 2;在语法上是正确的,因为它的对象名称和参数仍然以与写入字符串相同的方式包含在内。

这不是Java的工作原理。一种按照假设工作的语言不是Java 8。

在此示例中, integer literal 为2:当作为表达式求值时,它会产生值.. (int)2。与字符串文字的情况不同,Java然后执行Integer autoboxing operation:2是int,与String不同, Object }并且不能直接分配。这使得原始类似于Object x = new Integer(2);,其中int值被隐式包装为Integer-value。

答案 2 :(得分:1)

在Java中无法做到这一点。它只能用于原始类型变量和String。由于使用了很多字符串,因此它很特殊,您不必写出完整的new String("...")String x = "..."是一个例外,不是通常的创建对象。