当我浏览java.util.HashMap
的源代码时,我发现了init
的声明。
子类的初始化挂钩。在clone
初始化之后但在插入任何条目之前,在所有构造函数和伪构造函数(readObject
,HashMap
)中调用此方法。 (如果没有这种方法,readObject
将需要明确的子类知识。)
void init() {
}
我找到了一个相关的问题In Java, is there a legitimate reason to call a non-final method from a class constructor?
但是我仍然无法理解init的目的是什么以及为什么readObject
需要明确的子类知识?任何人都可以用一个例子来解释
答案 0 :(得分:3)
正如评论所说,它是子类的初始化钩子。每个子类都可以适当地重写init()
以执行在每种情况下都需要的初始化,没有必须提供readObject
的另一个实现来进行反序列化并重新实现clone()
。
例如,在LinkedHashMap
中,重写init()
方法以设置链接列表。如果init()
不可用,请考虑在反序列化时会发生什么。