Java可以初始化类似C++的对象数组中的对象,而不必循环和调用new
Can Java initialize the objects in an array of objects similar to C++, without having to loop and call new?
在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'
、0
、0.0
和false
。这是数组中每个元素将初始化为的值。
不,没有纯粹的数组方式可以实现您想要的功能。如果您不想显式地使用循环来解决这个问题,那么另一种方法可以是使用流(在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());
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等效物相同。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- 代理对象的常量正确性
- 提升 ASIO 无法识别计时器对象
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 如何返回一个类的两个对象相加的结果
- 使用std::函数映射对象方法
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 我想创建一个调用函数的源文件,而不必创建对象
- Java可以初始化类似C++的对象数组中的对象,而不必循环和调用new
- 有多少种方法可以生成临时对象/不必要地调用构造函数