• java中类中代码的执行顺序,附简繁两个Demo


    目录

    执行顺序:

     一个简单Demo

    复杂Demo

     顺序解析:


    执行顺序:

    1. 父类静态代码块(static) ->

    2. 子类静态代码块(static) ->

    3. 父类非静态代码块 ->

    4. 父类构造函数 ->

    5. 子类非静态代码块 ->

    6. 子类构造函数

    tips:

    • 执行遵循static优先原则
    • 静态代码块在类加载时执行,类加载在编译阶段(生成.class文件)完成,即只一次运行只执行一次
    • 当new对象的时候,从上至下执行一次非静态初始化语句和初始化块
    • 构造函数在创建对象时执行

     一个简单Demo

    1. package explore.testEntity;
    2. public class testClass {
    3. private String phone = a();
    4. private static String phone1 = a();
    5. static {
    6. System.out.println("static执行");
    7. }
    8. public static String a(){
    9. System.out.println("调用static方法a");
    10. return "调用static方法a";
    11. }
    12. public testClass(){
    13. System.out.println("构造函数");
    14. }
    15. {
    16. System.out.println("非静态内容");
    17. }
    18. public static void main(String[] args) {
    19. testClass tc = new testClass();
    20. }
    21. }

     

    复杂Demo

    1. package explore.testEntity;
    2. public class testClass {
    3. private static int k = 1;
    4. private static testClass t1 = new testClass("t1");
    5. private static testClass t2 = new testClass("t2");
    6. private static int i = print("i");
    7. private static int n = 99;
    8. {
    9. print("初始化块");
    10. }
    11. public testClass(String str) {
    12. System.out.println((k++) + ":" + str + " i=" + i + " n=" + n);
    13. ++i;
    14. ++n;
    15. }
    16. static {
    17. print("静态块");
    18. n = 100;
    19. }
    20. private int j = print("j");
    21. public static int print(String str) {
    22. System.out.println((k++) + ":" + str + " i=" + i + " n=" + n);
    23. ++n;
    24. return ++i;
    25. }
    26. public static void main(String[] args) {
    27. testClass tc = new testClass("explore.testClass.test");
    28. }
    29. }

     

     顺序解析:

    1. 首先执行main函数,创建一个新对象
    2. 第一次创建该类的对象,进行类的编译
    3. 首先从上至下执行静态部分
    4. k=1
    5. 执行创建t1对象
      1. 当一个内部创建一个他自身的对象的时候,不执行静态部分
      2. 从上至下执行非静态部分
      3. 非静态代码块调用print方法
        1. k为1,str为参数“初始化块”,i,j未赋值,为0(Integer包装类型未赋值才为null),i、n自增,return i
      4. 执行int j赋值
        1. 调用print方法
      5. 非静态方法执行完毕,执行构造函数public testClass(String str){...省略...}
      6. 构造函数执行完毕,t1对象创建完成
    6. 执行创建t2对象
      1. 创建过程同t1,只是i,k值始终在该类内部使用,数据一直在迭代
    7. 为i赋值
      1. ​​​​​​​调用print方法
    8. 为n赋值
    9. 执行静态代码块
      1. ​​​​​​​调用print方法
      2. n=100
    10. 静态部分执行完毕,从上至下执行非静态部分
    11. 非静态代码块
      1. ​​​​​​​调用print方法
    12. 为j赋值
      1. ​​​​​​​调用print方法
    13. ​​​​​​​非静态部分执行完毕,执行构造函数
    14. main方法中的创建对象执行完毕
  • 相关阅读:
    Java中使用Hutool的ExecutorBuilder实现自定义线程池
    java计算机毕业设计疫情下发热门诊管理系统MyBatis+系统+LW文档+源码+调试部署
    VSCode 好用的插件分享
    # Flink的状态
    gradle使用笔记整理
    【Linux】安装软件与运行程序
    QByteArray,char转float的方法以及计算机大小端判断
    RK3568开发笔记(八):开发板烧写buildroot固件(支持hdmi屏),搭建Qt交叉编译开发环境,编译一个Demo,目标板运行Demo测试
    如何在聊天记录中实时查找大量的微信群二维码
    百度智能云正式上线Python SDK版本并全面开源!
  • 原文地址:https://blog.csdn.net/qq_57031340/article/details/126680328