当前位置: 首页 > news >正文

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

目录

执行顺序:

 一个简单Demo

复杂Demo

 顺序解析:


执行顺序:

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

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

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

  4. 父类构造函数 ->

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

  6. 子类构造函数

tips:

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

 一个简单Demo

package explore.testEntity;

public class testClass {

    private String phone = a();
    private static String phone1 = a();

    static {
        System.out.println("static执行");
    }
    public static String a(){
        System.out.println("调用static方法a");
        return "调用static方法a";
    }
    public testClass(){
        System.out.println("构造函数");
    }
    {
        System.out.println("非静态内容");
    }


    public static void main(String[] args) {
        testClass tc = new testClass();
       
    }
}

 

复杂Demo

package explore.testEntity;

public class testClass {

    private static int k = 1;
    private static testClass t1 = new testClass("t1");
    private static testClass t2 = new testClass("t2");
    private static int i = print("i");
    private static int n = 99;

    {
        print("初始化块");
    }

    public testClass(String str) {
        System.out.println((k++) + ":" + str + "   i=" + i + "   n=" + n);
        ++i;
        ++n;
    }

    static {
        print("静态块");
        n = 100;
    }

    private int j = print("j");

    public static int print(String str) {
        System.out.println((k++) + ":" + str + "   i=" + i + "   n=" + n);
        ++n;
        return ++i;
    }

    public static void main(String[] args) {
        testClass tc = new testClass("explore.testClass.test");

    }
}

 

 顺序解析:

  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方法中的创建对象执行完毕

相关文章:

  • 数据中心设计方案 实例,数据中心网络设计方案
  • 算法笔记(四)从暴力递归到动态规划
  • golang设计模式——行为模式
  • springboot版HelloWorld
  • 在portacle中获取EMACS Lisp帮助文档的方法(Win11)
  • 线性代数学习笔记8-1:复数矩阵与Hermite矩阵、酉矩阵、傅里叶矩阵和快速傅里叶变换FFT
  • java ssm创意设计分享系统
  • ABAP Debug 调试功能
  • 【PAT甲级】1124 Raffle for Weibo Followers
  • 数组 vector
  • JAVA中的进制与位运算
  • C++怎么判断windows系统是64位还是32位
  • 位图,布隆过滤器的原理和实现
  • java医用物资信息管理系统 ssm
  • 【ELFK】之消息队列kafka
  • 自己简单写的 事件订阅机制
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • Javascript Math对象和Date对象常用方法详解
  • JavaScript 奇技淫巧
  • markdown编辑器简评
  • python_bomb----数据类型总结
  • python学习笔记 - ThreadLocal
  • REST架构的思考
  • sessionStorage和localStorage
  • 编写符合Python风格的对象
  • 猴子数据域名防封接口降低小说被封的风险
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 聚簇索引和非聚簇索引
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 赢得Docker挑战最佳实践
  • zabbix3.2监控linux磁盘IO
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​插件化DPI在商用WIFI中的价值
  • #define,static,const,三种常量的区别
  • #define、const、typedef的差别
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • $().each和$.each的区别
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (三) diretfbrc详解
  • (十)c52学习之旅-定时器实验
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)http-server应用
  • **python多态
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .net Stream篇(六)