今天突然想起以前做的一个试题,有关子类和父类静态代码块中执行顺序的问题,在代码中子类父类的静态代码块是怎么执行的,有覆盖吗,是继承的还是怎么样的?对此做了一个小的测试:

一个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类的静态代码可能同时执行完。

结果:静态代码不会被子类覆盖,子类和父类都有静态代码的时候,静态代码都会单独执行。