Java父类与子类中静态代码块 实例代码块 静态变量 实例变量 构造函数执行顺序

实例化子类时,父类与子类中的静态代码块、实例代码块、静态变量、实例变量、构造函数的执行顺序是怎样的?


代码执行的优先级为:

firest:静态部分

second:实例化过程


详细顺序为:

1.父类静态代码块与父类静态变量(取决于代码书写顺序)

2.子类静态代码块与子类静态变量(取决于代码书写顺序)

3.父类实例变量与父类代码块(取决于代码书写顺序)

4.父类构造函数

5.子类实例变量与父类代码块(取决于代码书写顺序)

6.子类构造函数


在JVM加载完类以后,类在被使用的时候初始化,静态部分只在类初始化的时候执行一次。


测试代码:

 

  1. class Father {  
  2.   
  3.     Father() {  
  4.         LogUtil.log(System.currentTimeMillis() + " ------ 父类构造函数");  
  5.     }  
  6.   
  7.     static {  
  8.         LogUtil.log(System.currentTimeMillis() + " ------ 父类静态代码块");  
  9.     }  
  10.   
  11.     long x = getTime(" ------ 父类实例变量");  
  12.   
  13.     {  
  14.         long time = System.currentTimeMillis();  
  15.         LogUtil.log(time + " ------ 父类代码块");  
  16.     }  
  17.   
  18.     static long y = getTime(" ------ 父类静态变量");  
  19.   
  20.     static long getTime(String who) {  
  21.         long time = System.currentTimeMillis();  
  22.         LogUtil.log(time + who);  
  23.         return time;  
  24.     }  
  25. }  
  26.   
  27. class Child extends Father {  
  28.   
  29.     Child() {  
  30.         LogUtil.log(System.currentTimeMillis() + " ------ 子类构造函数");  
  31.     }  
  32.   
  33.     static long y = getTime(" ------ 子类静态变量");  
  34.   
  35.     static {  
  36.         LogUtil.log(System.currentTimeMillis() + " ------ 子类静态代码块");  
  37.     }  
  38.   
  39.     {  
  40.         long time = System.currentTimeMillis();  
  41.         LogUtil.log(time + " ------ 子类代码块");  
  42.     }  
  43.   
  44.     long x = getTime(" ------ 子类实例变量");  
  45.   
  46.     static long getTime(String who) {  
  47.         long time = System.currentTimeMillis();  
  48.         LogUtil.log(time + who);  
  49.         return time;  
  50.     }  
  51. }  

调用代码:

  1. new Thread(new Runnable() {  
  2.             @Override  
  3.             public void run() {  
  4.                 new Child();  
  5.                 LogUtil.log("分隔符 ------ 分隔符");  
  6.                 new Child();  
  7.             }  
  8.         }).start();  


执行结果:

    1. 11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523353 ------ 父类静态代码块  
    2. 11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523353 ------ 父类静态变量  
    3. 11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523353 ------ 子类静态变量  
    4. 11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523353 ------ 子类静态代码块  
    5. 11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523353 ------ 父类实例变量  
    6. 11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523353 ------ 父类代码块  
    7. 11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523353 ------ 父类构造函数  
    8. 11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523353 ------ 子类代码块  
    9. 11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523353 ------ 子类实例变量  
    10. 11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523353 ------ 子类构造函数  
    11. 11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 分隔符 ------ 分隔符  
    12. 11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523353 ------ 父类实例变量  
    13. 11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523353 ------ 父类代码块  
    14. 11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523353 ------ 父类构造函数  
    15. 11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523354 ------ 子类代码块  
    16. 11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523354 ------ 子类实例变量  
    17. 11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523354 ------ 子类构造函数 
posted @ 2017-03-27 14:49  一点点征服  阅读(343)  评论(0编辑  收藏  举报