今天突然想起以前做的一个试题,有关子类和父类静态代码块中执行顺序的问题,在代码中子类父类的静态代码块是怎么执行的,有覆盖吗,是继承的还是怎么样的?对此做了一个小的测试:
一个People父类:
public abstract class People { private static final String TAG = "People"; static { Logger.e(TAG,"people 类 静态代码块"); } }一个子类Man: public class Man extends People { private static final String TAG = "Man"; static { Logger.e(TAG,"people 类 静态代码块"); } }
一个Woman类:
public class Woman extends People { private static final String TAG = "Woman"; static { Logger.e(TAG,"woman 类 静态代码块"); } } 一个Client类: public class Client { private static final String TAG = "Client"; static { Logger.e(TAG,"Client 类 静态代码块"); } Man longlong = new Man(); Woman ruirui = new Woman(); @Test public void test1(){ longlong.describe(); Logger.e(TAG,"-------------------------\n"); } }上述几个类都加了一个静态代码块,Man继承了People 类,People中有一个普通方法describe();子类重写这个方法输出一句描述信息,Man类中重写了一下,这里同时可以看一下重写的执行状态。在Client中创建对象执行test1方法结果:
Client 2017-05-05 04:32:48 Client 类 静态代码块 People 2017-05-05 04:32:48 people 类 静态代码块 Man 2017-05-05 04:32:48 people 类 静态代码块 Woman 2017-05-05 04:32:48 woman 类 静态代码块 Man 2017-05-05 04:32:48 Mna类中describ方法--前 People 2017-05-05 04:32:48 People describe类信息 Man 2017-05-05 04:32:48 Mna类中describ方法--后 Client 2017-05-05 04:32:48 -------------------------重结果可以看出:先执行了Client类的静态代码块。
Man集成了Peolpe类,结果中People类,man类的静态代码块都做了输出,也就是没有覆盖,也没有继承。
执行顺序:先执行了父类People 的静态代码块,
People 2017-05-05 04:32:48 people 类 静态代码块然后执行了子类的静态代码块 Man 2017-05-05 04:32:48 people 类 静态代码块貌似是这样的结果,怎么多了一句 Woman 2017-05-05 04:32:48 woman 类 静态代码块发现原来是Client中创建了Woman的对象 Man longlong = new Man(); Woman ruirui = new Woman();注释掉这个,同时注释掉test1方法中的 longlong.describe();这句后结果是: Client 2017-05-05 04:44:21 Client 类 静态代码块 People 2017-05-05 04:44:21 people 类 静态代码块 Man 2017-05-05 04:44:21 people 类 静态代码块 Client 2017-05-05 04:44:21 ------------------------- 没有输出Woman类的静态代码块。 添加一个系统时间 System.currentTimeMillis() 结果是: Client 2017-05-05 04:51:48 Client 类 静态代码块:1493974308588 People 2017-05-05 04:51:48 people 类 静态代码块:1493974308620 Man 2017-05-05 04:51:48 people 类 静态代码块:1493974308621 Client 2017-05-05 04:51:48 -------------------------或者: Client 2017-05-05 04:54:20 Client 类 静态代码块:1493974460466 People 2017-05-05 04:54:20 people 类 静态代码块:1493974460505 Man 2017-05-05 04:54:20 people 类 静态代码块:1493974460505 Client 2017-05-05 04:54:20 ------------------------- 看出来Client 类的静态代码块最先执行,接着是People父类的,最后是Man子类。单从执行时间看People类的和Man类的静态代码可能同时执行完。结果:静态代码不会被子类覆盖,子类和父类都有静态代码的时候,静态代码都会单独执行。