有规律的,你这还不算复杂,如果包含父类以及内部类(非静态)就更复查,但是万变不离其宗。
规律一、初始化构造时,先父后子;只有在父类所有都构造完后子类才被初始化
规律二、类加载先是静态、后非静态、最后是构造函数
静态构造块、静态类属性按出现在类定义里面的先后顺序初始化,同理非静态的也是一样的,只是静态的只在加载字节码是执行一次,不管你new多少次,非静态会在new多少次就执行多少次
规律三、java中的类只有在被用到的时候才会被加载
规律四、java类只有在类字节码被加载后才可以被构造成对象实例
上面四条规律就解析你上面不能理解代码执行结果的原因了
- xdev回复 @Archer2ee : 非静态是在new申请内存空间并初始化其值。java类是必须先加载字节码,然后通过new(有些不需要new,比如枚举和字符串,可以看jvm规范说明)根据字节码信息申请类的内存空间。上面的四种规律都是java虚拟机的规范严格规定的,只有实现规范的虚拟机才可以叫java虚拟机,所以ibm、oracle的虚拟机都符合上面四个规律。 (5个月前)
- xdev回复 @Archer2ee : 哈哈,确实,这个地方没有说的详细,类初始化化是分,静态,和非静态,静态是在类的字节码加载到jvm时,仅且只执行一次,按照先父后子,父子静态都初始化完后,跟据需要再初始化父子非静态部分(也就是说静态和非静态是分开的,但往往因为new的时候类即加载类同时也申请内存空间,可以先通过类名加静态方法或者静态属性代码调用来分开两个过程)。 (5个月前) 回复