【发布时间】:2014-11-30 08:56:30
【问题描述】:
我一直在复习 Java,我读过“初始化程序块可以调用方法”
尽管构造函数没有执行,它可以调用实例方法吗?这只是皱眉吗?
编辑:我看到编译器允许这样做,所以问题是,这是一种好、安全的做法吗?
【问题讨论】:
-
基本上是this。不要在构造函数或实例初始化器中调用非最终的、非私有的方法。
标签: java oop initializer
我一直在复习 Java,我读过“初始化程序块可以调用方法”
尽管构造函数没有执行,它可以调用实例方法吗?这只是皱眉吗?
编辑:我看到编译器允许这样做,所以问题是,这是一种好、安全的做法吗?
【问题讨论】:
标签: java oop initializer
instance initializer 块将作为任何构造函数执行的一部分被调用。所以你可以看到它好像被编译器复制到每个构造函数中一样。
这使您的问题更简单:这与问:“从构造函数调用实例方法是否安全?”
只要你调用的方法不能在子类中被覆盖,这完全没问题。
因此,如果您的方法是private 或final,则没有问题。
在这些情况下,最好有一种方法,而不是复制粘贴相同或相似的代码。
当子类可以覆盖一个方法时,就会出现问题,因为那时您会从构造函数调用该方法,但子类构造函数尚未执行。该方法将尝试访问尚未初始化的字段。
更多详情:What's wrong with overridable method calls in constructors?
【讨论】: