• 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方法中的创建对象执行完毕
  • 相关阅读:
    大道至简读后感
    数据结构·顺序表
    19-k8s的附加组件-coreDNS组件
    华为od-C卷200分题目2 - 找城市
    低时延、高可靠、华为云CDN赋能中小企业
    neo4j 图数据库初步调研 三元组、属性图、图模型、超图、RDF-f
    一篇让你无论跳槽还是晋升,都甩别人几条街的知识
    贴近摄影测量,如何让平遥古城焕发生机?
    递归思想
    SpringBoot : ch04 整合数据源
  • 原文地址:https://blog.csdn.net/qq_57031340/article/details/126680328