为什么要在所有构造函数中显式初始化空白的final变量?

时间:2017-11-16 12:21:24

标签: java constructor final

我刚开始阅读Java。我觉得令人困惑的一件事是应该在类的所有构造函数中初始化一个空白的final变量。如果我有一个带有3个构造函数的类,并且我在一个构造函数中初始化一个空白的最终变量,为什么我还需要在其他两个构造函数中初始化相同的空白最终变量?

2 个答案:

答案 0 :(得分:4)

最终变量必须在创建类的实例时(即在构造函数执行完成后)初始化。

如果使用其中一个未初始化空白最终变量的构造函数创建类的实例,则一旦构造函数执行完毕,最终变量将不会被初始化。

因此,所有构造函数都必须初始化空白的最终变量。

这假设没有任何构造函数使用this()调用不同的构造函数。

J.L.S Chapter 16. Definite Assignment

  

每个局部变量(第14.4节)和每个空白最终字段(第4.12.4节,第8.3.1.2节)必须具有明确赋值,以便对其值进行任何访问。

如果使用未初始化空白最终字段的构造函数创建类的实例,则可以在分配之前访问该字段。因此编译器不允许它。

答案 1 :(得分:0)

这是因为在创建类的实例时只执行一个构造函数。

我更喜欢有一个构造函数作为最常见的构造函数,并从其他构造函数中调用它。在一个构造函数中,您可以通过fun main(args: Array<String>) { println("123".represents(123)) println(123.represents("123")) } fun String.represents(another: Int) = toIntOrNull() == another val represents: Int.(String) -> Boolean = {this == it.toIntOrNull()} 调用同一个类的另一个构造函数。例如:

this(...)

这样,您就有责任在一个构造函数中初始化实例。其他构造函数依赖于那个。