Java可以初始化类似C++的对象数组中的对象,而不必循环和调用new

Can Java initialize the objects in an array of objects similar to C++, without having to loop and call new?

本文关键字:对象 不必 循环 new 调用 数组 初始化 C++ Java      更新时间:2023-10-16

在C++中,代码Card cards[20];初始化20个Card对象,而在Java中,代码Card[] cards = new Card[20];初始化一个可以容纳20个Card的数组,但Card对象实际上并没有初始化。你必须做

for (int i = 0; i < cards.length; i++) {
    cards[i] = new Card();
}

有没有什么方法可以避免在Java中这样做,类似于C++?

不,没有。

数组元素是值。

对于引用类型,该值是一个引用。引用的默认初始化值为null。这是数组中每个元素将被初始化为的值。您必须自己显式初始化元素才能引用新对象。

对于基元类型,该值是基元类型值、char、整数、浮点值或布尔值。它们的默认值分别为'u0000'00.0false。这是数组中每个元素将初始化为的值。

不,没有纯粹的数组方式可以实现您想要的功能。如果您不想显式地使用循环来解决这个问题,那么另一种方法可以是使用流(在Java8中添加)。

Card[] cards  = Stream.generate(Card::new).limit(20).toArray(Card[]::new);

或者可能使用Arrays.setAll将是不那么神秘的

Card[] cards  = new Card[20];
Arrays.setAll(cards, i -> new Card());
Java Card[] cards = new Card[20];的C++等价物大致为Card* cards[20];(或现代C++中的std::array<Card*, 20> cards;)。

事实证明,如果你想让这些指针真正指向内存中的Card对象,你也必须显式初始化C++中的每个数组元素:

for (int i = 0; i < 20; ++i)
{
    cards[i] = new Card;
}

C++Card card[20]不存在Java等价物,原因与C++Card single_card;不存在Java等效物相同。