我们可以创建一个没有括号的对象吗?

Can we create an object without parentheses?

根据 this site 创建 Java 对象的语法是:

<JavaType> <variable> = new <JavaObject>();

尽管在创建 Array 对象时不使用任何括号,而是键入包含每个维度长度的括号。

示例:

String[][] stringMatrix = new String[5][10];

我想知道的是,如果此语法专门用于创建数组对象,或者我可以自定义 class 其对象的创建方式与通常的方式不同

new <JavaObject>();

声明。

它专门用于创建数组。您的 类.

被括号困住了

new关键字用于为特定类型分配内存,后面跟着new关键字。

MyClass obj = new MyClass();

上一行将为MyClass创建一个对象(分配内存)并通过调用默认构造函数初始化成员变量。

但是,下面的代码行只会分配内存并使用默认值 null.

初始化数组的每个元素
MyClass[][] objMatrix = new MyClass[5][10];

因此,我们只是声明了一个大小为 5x10 的数组(分配内存),但是数组中的每个元素都需要一些对象引用(因为目前它们有 null 引用)。因此,出于这个原因,您需要通过创建 MyClass 的对象并将它们分配给每个元素来初始化每个 objMatrix 数组元素。

objMatrix[0][0] = new MyClass();

您不能创建自定义 class 来更改 new 运算符的工作方式。但是,在某些特殊情况下,可以在不使用通常的 new 运算符的情况下创建对象。

例如

String[] array = { "foo", "bar", "baz" };
Integer value = 42;

证明您可以在变量初始值设定项中创建不带 new 关键字的数组,使用 String 对象,使用文字和自动框原始值作为对象对应物,无需通常的 new 语法,当然,这对于自定义类型是不可能的。

不使用 new 运算符创建对象的另一种可能性是反序列化它们,如果它们是 Serializable.

,这也适用于自定义类型

从 Java 8 开始,如果您有适当的上下文,您可以使用构造函数引用,例如

BigDecimal[] array = new BigDecimal[20];
Arrays.setAll(array, BigDecimal::new);
System.out.println(Arrays.toString(array));

此处,BigDecimal::new 是对 BigDecimal 的构造函数的引用,并且从上下文中暗示,即 Arrays.setAll 该函数必须能够使用 int 值,因为 setAll 方法将为每个数组元素计算它,传递数组索引,所以我们在这个例子中用升序数字初始化数组。

另一个例子是

BigDecimal[] array = Stream.of("1.23", "4.56", "7.89")
                           .map(BigDecimal::new)
                           .toArray(BigDecimal[]::new);
System.out.println(Arrays.toString(array));

上下文暗示 .map(BigDecimal::new) 步骤中使用的构造函数必须消耗一个 String,因为它将针对每个流元素进行评估,最终以不同的构造函数结束在第一个例子中。

BigDecimal 是一个普通的 class,这些示例也可以与自定义的 class 一起使用,如果它具有匹配的构造函数的话。