在C中,初始化器列表是必需的,因为有一些语言特性不存在于Java中或在Java中工作不同:

> const:在C中,可以定义一个标记为const的字段,该字段不能分配给初始化器列表,并且必须在初始化器列表中初始化。 Java有final字段,但你可以分配给构造函数主体中的final字段。在C中,赋值给构造函数中的const字段是非法的。

>参考:在C中,引用(而不是指针)必须初始化以绑定到某个对象。在没有初始化器的情况下创建引用是非法的。在C中,你指定的方式是使用初始化器列表,因为如果你在引用构造函数主体中的引用而没有首先初始化它,你将使用一个未初始化的引用。在Java中,对象引用的行为类似于C指针,可以在创建后分配给它。他们只是默认为null否则。

>直接子对象。在C中,对象可以直接包含对象作为字段,而在Java对象中只能保存对这些对象的引用。也就是说,在C中,如果你声明一个有一个字符串作为成员的对象,那么该字符串的存储空间直接被建立到该对象本身的空间中,而在Java中你只是获得空间来引用其他String对象存储在其他地方。因此,C需要提供一种方法来给这些子对象初始值,否则它们只是保持未初始化。默认情况下,它使用这些类型的默认构造函数,但如果你想使用不同的构造函数或没有默认构造函数可用,初始化器列表给你一个方法来绕过这个。在Java中,你不需要担心这个,因为引用将默认为null,然后你可以分配它们来引用你实际想要他们引用的对象。如果你想使用非默认构造函数,那么你不需要任何特殊的语法;只是设置对通过适当的构造函数初始化的新对象的引用。

在少数情况下,Java可能需要初始化器列表(例如,调用超类构造函数或给其字段赋予默认值),这是通过两个其他语言特性来处理的:调用超类构造函数的super关键字,以及Java对象可以在它们被声明的点处给它们的字段默认值。因为C有多重继承,只有一个super关键字不会明确地指向一个单独的基类,而在C 11 C之前不支持在类中的默认初始化器,并且不得不依赖于初始化器列表。

希望这可以帮助!