运行结果:
父类–静态代码块
子类–静态代码块
父类–非静态代码块
父类–构造函数
子类–非静态代码块
子类–构造函数
子类–静态方法
总结:
1、它首先去看父类里面有没有静态代码块,如果有,它先去执行父类里面静态代码块里面的内容,当父类的静态代码块里面的内容执行完毕之后, 接着去执行子类(自己这个类)里面的静态代码块,
2、当子类的静态代码块执行完毕之后,它接着又去看父类有没有非静态代码块,如果有就执行父类的非静态代码块,父类的非静态代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代 码块。子类的非静态代码块执行完毕再去执行子类的构造方法,这个就是一个对象的初始化顺序。
3、先执行静态块中的内容,其次判断是否有静态方法在new uExtend()之前执行,如果有的话,就先执行静态方法(在执行构造方法之前先执行静态方法),否则直接执行非静态方法,之后执行构造方法。
这里的静态方法的执行顺序不同是由于 如果new B()方法位置在调用静态方法之前,则静态方法在执行完构造方法(new uExtend())之后再调用。