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

【Java基础知识系列】之Java类的初始化顺序

前言

在这里插入图片描述

类的初始化顺序

  • 简单场景
    • 代码示例
    public class Person {private String name = initName();private String initName() {System.out.println("【父类】初始化实例变量name");return "【父类】史蒂夫";}private int age;private static int staticVar1 = initStaticVar1();private static int staticVar2;private static int initStaticVar1() {System.out.println("【父类】初始化静态变量staticVar1");return 100;}public Person() {System.out.println("【父类】我是无参构造方法");}public Person(String name, int age) {System.out.println("【父类】我是有参构造方法");this.name = name;this.age = age;}{System.out.println("【父类】我是实例代码块");}static {System.out.println("【父类】我是静态代码块");}}
    
    public class PersonTest {@Testpublic void testInitPerson() {Person person = new Person();System.out.println();Person person1 = new Person();System.out.println();Person person2= new Person("工藤新一",22);}}
    
    • 输出结果
    【父类】初始化静态变量staticVar1
    【父类】我是静态代码块
    【父类】初始化实例变量name
    【父类】我是实例代码块
    【父类】我是无参构造方法【父类】初始化实例变量name
    【父类】我是实例代码块
    【父类】我是无参构造方法【父类】初始化实例变量name
    【父类】我是实例代码块
    【父类】我是有参构造方法
    
  • 复杂场景(有继承)
    • 代码示例
    public class Man extends Person {private String name = initName();private String initName() {System.out.println("【子类】初始化实例变量name");return "【子类】工一";}private int age;private static int staticVar1 = initStaticVar1();private static int staticVar2;private static int initStaticVar1() {System.out.println("【子类】初始化静态变量staticVar1");return 100;}public Man() {System.out.println("【子类】我是无参构造方法");}public Man(String name, int age) {System.out.println("【子类】我是有参构造方法");this.name = name;this.age = age;}{System.out.println("【子类】我是实例代码块");}static {System.out.println("【子类】我是静态代码块");}}
    
    public class ManTest {@Testpublic void testInitMan() {Man man = new Man();System.out.println();Man man1 = new Man();System.out.println();Man man2 = new Man("工藤新一", 22);}}
    
    • 输出结果
    【父类】初始化静态变量staticVar1
    【父类】我是静态代码块
    【子类】初始化静态变量staticVar1
    【子类】我是静态代码块
    【父类】初始化实例变量name
    【父类】我是实例代码块
    【父类】我是无参构造方法
    【子类】初始化实例变量name
    【子类】我是实例代码块
    【子类】我是无参构造方法【父类】初始化实例变量name
    【父类】我是实例代码块
    【父类】我是无参构造方法
    【子类】初始化实例变量name
    【子类】我是实例代码块
    【子类】我是无参构造方法【父类】初始化实例变量name
    【父类】我是实例代码块
    【父类】我是无参构造方法
    【子类】初始化实例变量name
    【子类】我是实例代码块
    【子类】我是有参构造方法
    

结论

  • 简单场景
    静态变量>静态代码块>实例变量>实例代码块>构造方法

    其中静态代码块和静态变量只会执行一次(第一次new对象的时候会执行)
  • 有继承场景
    【父类】静态变量>【父类】静态代码块>【子类】静态变量>【子类】静态代码块>【父类】实例变量>【父类】实例代码块>【父类】构造方法>【父类】实例变量>【父类】实例代码块>【父类】构造方法

    其中【父类】静态变量 、【父类】静态代码块、【子类】静态变量 、【子类】静态代码块只会执行一次(第一次new对象的时候会执行)

术语

  • 静态变量
  • 成员变量
  • 静态代码块
  • 实例代码块
  • 构造方法

你问我答

1.Q:静态变量,成员变量,静态代码块、动态代码块、构造方法在代码中的位置顺序会影响执行结果么?

A:不会

源码地址

Java类的初始化顺序-源码

参考文章

  • Java类的初始化顺序
  • Java类的执行顺序
http://www.lryc.cn/news/485347.html

相关文章:

  • Swift 宏(Macro)入门趣谈(二)
  • vue elementui el-dropdown-item设置@click无效的解决方案
  • 如何用re从第1排第2个位置中找到两个数字返回(0,1)
  • vue中的keep-alive是什么,有哪些使用场景,使用了什么原理,缓存后如何更新数据
  • LeetCode105.从前序与中序遍历构造二叉树
  • LeetCode654.最大二叉树
  • C# 字段和属性
  • 【leetcode】N皇后 回溯法c++
  • Ubuntu 系统端口查询与管理详细分析
  • Unity中使用StartCoroutine协程和Lerp方法,使GameObject缓慢移动
  • C++根据特定字符截取字符串
  • 【How AI Works】读书笔记3 出发吧! AI纵览 第二部分
  • No Module named pytorchvideo.losses问题解决
  • Mac终端字体高亮、提示插件
  • Flowable 构建后端服务(后端以及数据库搭建) Flowable Modeler 设计器搭建(前端)
  • [Java]微服务拆分
  • JavaScript逆向爬虫教程-------基础篇之JavaScript混淆原理
  • qt移植到讯为rk3568,包含一些错误总结
  • 使用阿里云快速搭建 DataLight 平台
  • ubuntu设置自启动
  • Paddle分布式训练报NCCL错
  • PD3.1快充对我们到底有没有必要?
  • Android OpenGL ES详解——立方体贴图
  • Bugku CTF_Web——字符?正则?
  • C# 中Math.Round 和 SQL Server中decimal(18,2) 不想等的问题
  • lab2:docker基础实战
  • Druid 1.2 源码导读
  • 千益畅行,共享旅游卡市场乱象解析与未来展望
  • Dubbo源码解析-服务导出(四)
  • 浅谈React的虚拟DOM