类加载机制

有赋值的类 成员属性是按声明的位置先后进行初始化(与访问标志符无关);
成员属性的初始化会优先于构造函数的初始化;

初始化动作都是在构造函数中完成的, 如果没有显示构造函数,那么编译器会产生一个无入参构造函数来完成初始工作;

建议声明成员属性时没有必要赋于null,等到真实需要使用成成员时再初始化或传递值;

非静态代码块的执行也是被放到构造函数中。

非静态代码块并不影响代码顺序的初始化工作

尽量不要有非静态的代码块,可读性不好,需要在非静态代码块解决的问题完全可以移到构造函数中。

因为静态变量和静态代码块与所在的类被实例化个数无关,而是所在类被虚拟机加载时会执行对应的静态代码块的字节码,这是类被加载事件触发的,并会因为类实例才会有,比如第一次执行下面的非实例化的代码同样会触发该类的静态代码块执行。 注:并非代码中类一出现就会进行加载静态初始化,有些被编译本地化的代码就会不执行,比如使用某个类声明时已经赋值的static+final的属性时

1、一性次:优先加载类时会初始化静态成员/静态代码块 ,顺序为父类 ->子类,每个类在JVM只会被初始化一次,除非类被卸载再加载;

2、接着会按继承关系执行:父类成员属性/非静态代码块 ->父类构造函数 ->成员属性/非静态代码 ->构造函数;

摘自:http://my.oschina.net/imcf/blog/647602?fromerr=Xv90V6DF

评论已关闭。