我们可以创建一个没有括号的对象吗?
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 一起使用,如果它具有匹配的构造函数的话。
根据 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 一起使用,如果它具有匹配的构造函数的话。