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

简介:

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


代码执行的优先级为:

firest:静态部分

second:实例化过程


详细顺序为:

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

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

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

4.父类构造函数

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

6.子类构造函数


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


测试代码:

 

[java]  view plain  copy
  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. }  

调用代码:

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


执行结果:

[plain]  view plain  copy
    1. 11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523353 ------ 父类静态代码块  
    2. 11-03 20:02:03.35
    3. 0 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: 1478174523353 ------ 子类构造函数  
    12. 11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 分隔符 ------ 分隔符  
    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: 1478174523353 ------ 父类构造函数  
    16. 11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523354 ------ 子类代码块  
    17. 11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523354 ------ 子类实例变量  
    18. 11-03 20:02:03.350 7533-7881/? E/AKADDEMO: 1478174523354 ------ 子类构造函数 


    本文转自 一点点征服   博客园博客,原文链接:http://www.cnblogs.com/ldq2016/p/6626700.html ,如需转载请自行联系原作者
相关文章
java构造方法,构造代码块,静态代码块的执行顺序
本文介绍了Java中构造方法、构造代码块和静态代码块的执行顺序。静态代码块用`static`声明,在JVM加载类时执行一次;构造代码块在每次创建对象时执行,先于构造方法;构造方法用于对象初始化,创建对象时调用。示例代码展示了这三者的输出顺序,并解释了它们的区别和应用场景。
493 1
|
缓存 运维 Java
Java静态代码块深度剖析:机制、特性与最佳实践
在Java中,静态代码块(或称静态初始化块)是指类中定义的一个或多个`static { ... }`结构。其主要功能在于初始化类级别的数据,例如静态变量的初始化或执行仅需运行一次的初始化逻辑。
595 4
|
存储 安全 Java
探索 Java 静态变量(static)的奥秘
本文深入探讨了Java中的静态变量(`static`),从初印象、使用场景、访问方式、初始化、线程安全、优缺点到最佳实践,全面解析其特性和应用场景。静态变量属于类而非实例,适用于共享数据、定义全局常量和工具类中的变量。它在类加载时初始化,生命周期贯穿整个程序运行。然而,多线程环境下需注意线程安全问题,可通过`synchronized`或原子类解决。优点包括共享数据方便和提高性能,但也存在线程安全和代码耦合度增高的缺点。最佳实践建议谨慎使用、保证线程安全、遵循命名规范并封装访问。掌握静态变量的正确用法,能让你的代码更加高效简洁。
1222 11
|
Java 程序员 数据库连接
Java执行顺序大揭秘:静态块、非静态块和构造方法谁先谁后?
本文详细介绍了Java中的初始化块,包括静态初始化块和非静态初始化块的概念、执行顺序和实际应用场景。通过具体示例,帮助读者理解这两种初始化块的区别和使用场景,让面试官对你刮目相看。
309 0
Java执行顺序大揭秘:静态块、非静态块和构造方法谁先谁后?
Java 静态变量的初始化顺序
【10月更文挑战第15天】了解 Java 静态变量的初始化顺序对于正确编写和维护代码至关重要。通过深入理解初始化顺序的原理和细节,我们可以更好地避免潜在的问题,并提高代码的质量和可靠性。
通过Java代码解释成员变量(实例变量)和局部变量的区别
本文通过一个Java示例,详细解释了成员变量(实例变量)和局部变量的区别。成员变量属于类的一部分,每个对象有独立的副本;局部变量则在方法或代码块内部声明,作用范围仅限于此。示例代码展示了如何在类中声明和使用这两种变量。
|
Java
Java“非静态变量 ... 不能在静态上下文中被引用”解决
Java中遇到“非静态变量不能在静态上下文中被引用”的错误,通常是因为尝试在静态方法或静态块中访问实例变量。解决方法是将变量声明为静态(static)或通过实例对象来访问该变量。
1195 6
|
Java 编译器
【一步一步了解Java系列】:子类继承以及代码块的初始化
【一步一步了解Java系列】:子类继承以及代码块的初始化
518 3
|
Java 程序员 API
从代码中寻找平衡:’java代码块和具体的代码应用
Java 8 引入的 Lambda 表达式是一项革命性特性,使编写简洁、灵活且易维护的代码成为可能。Lambda 表达式作为一种匿名函数,支持任意数量参数和返回值,其基本语法为 `(parameters) -> expression` 或 `(parameters) -> { statements; }`。
180 1
|
存储 Java 关系型数据库
20 个实例玩转 Java 8 Stream
20 个实例玩转 Java 8 Stream
489 0
20 个实例玩转 Java 8 Stream