java 子类,父类静态代码块

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

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

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





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值