2 回答
TA贡献1966条经验 获得超4个赞
类初始化
对常量变量(§4.12.4)的字段的引用必须在编译时解析为由常量变量的初始化器表示的值V。
如果这样的字段是静态的,那么在二进制文件中的代码中不应该存在对该字段的引用,包括声明该字段的类或接口。这样的字段必须始终看起来已经初始化(§12.4.2);字段的缺省初始值(如果与V不同)绝不能被观察到。
如果这样的字段是非静态的,那么除了包含字段的类之外,二进制文件中的代码中不应该存在对字段的引用。(它将是一个类,而不是一个接口,因为接口只有静态字段。)类应该有代码,以便在实例创建期间将字段的值设置为V(§12.5)。
对象初始化
将构造函数的参数分配给此构造函数调用的新创建的参数变量。
如果该构造函数以同一个类中的另一个构造函数的显式构造函数调用(§8.8.7.1)开始(使用此方法),则使用这五个步骤递归地计算参数和处理构造函数调用。如果构造函数调用突然完成,则此过程出于同样的原因突然完成;否则,继续执行步骤5。
此构造函数不以同一类中的另一个构造函数的显式构造函数调用开始(使用此方法)。如果此构造函数用于对象以外的类,则此构造函数将以超类构造函数的显式或隐式调用(使用超级)开始。使用这五个步骤递归地评估超类构造函数调用的参数和过程。如果构造函数调用突然完成,则此过程出于同样的原因突然完成。否则,继续执行步骤4。
为该类执行实例初始化器和实例变量初始化器,将实例变量初始化器的值按从左到右的顺序分配给相应的实例变量,这些变量在类的源代码中以文本形式出现。如果执行这些初始化程序中的任何一个都会导致异常,那么将不再处理其他初始化器,并且该过程在相同的异常下突然完成。否则,继续执行步骤5。
执行此构造函数主体的其余部分。如果该执行突然完成,则此过程出于同样的原因突然完成。否则,此过程将正常完成。
TA贡献1831条经验 获得超9个赞
java:
import javax.annotation.PostConstruct;/** * Test steps of instance creation. * * @author eric * @date Jan 7, 2018 3:31:12 AM */public class InstanceCreateStepTest { public static void main(String[] args) { new Sub().hello(); System.out.printf("%s\n", "------------"); new Sub().hello(); }}class Base { static { System.out.printf("%s - %s - %s\n", "base", "static", "block"); } { System.out.printf("%s - %s - %s\n", "base", "instance", "block"); } public Base() { System.out.printf("%s - %s\n", "base", "constructor"); } @PostConstruct public void init() { System.out.printf("%s - %s\n", "base", "PostConstruct"); } public void hello() { System.out.printf("%s - %s\n", "base", "method"); }}class Sub extends Base { static { System.out.printf("%s - %s - %s\n", "sub", "static", "block"); } { System.out.printf("%s - %s - %s\n", "sub", "instance", "block"); } public Sub() { System.out.printf("%s - %s\n", "sub", "constructor"); } @PostConstruct public void init() { System.out.printf("%s - %s\n", "sub", "PostConstruct"); } @Override public void hello() { // super.hello(); System.out.printf("%s - %s\n", "sub", "method"); }}
处决:
小贴士:
标记的方法 @PostConstruct
不会被调用,除非您在某个容器中调用它,例如 Spring-boot
,因为它依赖于那些容器来实现注释,如 @PostConstruct
.
添加回答
举报