Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 可以从初始值设定项块调用实例方法吗?_Java_Oop_Initializer - Fatal编程技术网

Java 可以从初始值设定项块调用实例方法吗?

Java 可以从初始值设定项块调用实例方法吗?,java,oop,initializer,Java,Oop,Initializer,我一直在复习Java,我读过“初始化程序块可以调用方法” 即使构造函数没有执行,它还能调用实例方法吗?这只是不赞成吗 编辑:我看到编译器允许这样做,所以问题是,这是一种好的、安全的做法吗?实例初始值设定项块将作为任何构造函数执行的一部分被调用。因此,您可以看到它,就像编译器将它复制到每个构造函数中一样 这使您的问题更简单:这与问“从构造函数调用实例方法是否安全?” 只要您正在调用的方法不能在子类中被重写,这是完全正确的。 因此,如果您的方法是private或final,则没有问题 在这些情况下,

我一直在复习Java,我读过“初始化程序块可以调用方法”

即使构造函数没有执行,它还能调用实例方法吗?这只是不赞成吗

编辑:我看到编译器允许这样做,所以问题是,这是一种好的、安全的做法吗?

实例初始值设定项块将作为任何构造函数执行的一部分被调用。因此,您可以看到它,就像编译器将它复制到每个构造函数中一样

这使您的问题更简单:这与问“从构造函数调用实例方法是否安全?”

只要您正在调用的方法不能在子类中被重写,这是完全正确的。 因此,如果您的方法是
private
final
,则没有问题

在这些情况下,最好使用复制粘贴相同或类似代码的方法

当一个子类可以重写一个方法时,就会出现问题,因为这样您就可以从构造函数调用该方法,但子类构造函数尚未执行。该方法将尝试访问尚未初始化的字段

有关更多详细信息:

基本上。不要在构造函数或实例初始值设定项中调用非final、非private方法。