今天突然想起以前做的一个试题,有关子类和父类静态代码块中执行顺序的问题,在代码中子类父类的静态代码块是怎么执行的,有覆盖吗,是继承的还是怎么样的?对此做了一个小的测试:
一个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类的静态代码可能同时执行完。
结果:静态代码不会被子类覆盖,子类和父类都有静态代码的时候,静态代码都会单独执行。