当你知道了这些都指的是什么了,直接在程序里面写一遍不就行了,运行完记住顺序。
所以重点是记住代码都是什么样子的,怎么写的
package shunxu; public class shunxun { static class a { { System.out.println("a构造代码块"); } static{ System.out.println("a静态代码块"); } public a() { System.out.println("a构造函数"); } void hh(){ System.out.println("a普通方法"); } } static class b extends a { public b() { System.out.println("b构造函数"); } static{ System.out.println("b静态代码块"); } { System.out.println("b构造代码块"); } void hh(){ System.out.println("b普通方法"); } } public static void main(String[] args) { a aa = new b(); System.out.println("-------分割线----"); new b(); } }
结果
a静态代码块 b静态代码块 a构造代码块 a构造函数 b构造代码块 b构造函数 -------分割线---- a构造代码块 a构造函数 b构造代码块 b构造函数
a是父类,b是子类,分割线后是第二次执行,所以静态代码块没有再次执行。
顺序总结:
先静态(先父后子(静态变量和静态初始化块是按照他们在类中出现的前后顺序执行)),
然后非静态(先父后子(父类构造块和变量+父类构造器执行完毕,考虑子类构造块和变量+子类构造器))
第二次执行的话,不考虑静态,除非调用