浅谈Java父子类加载顺序


Posted in Java/Android onAugust 04, 2021

先上桌结论,优先被加载的顺序如下:

父类静态成员变量 > 父类静态代码块 > 子类静态成员变量 > 子类静态代码块 > 父类非静态成员变量 > 父类非静态代码块 > 父类构造方法 > 子类非静态成员变量 > 子类非静态代码块 > 子类构造方法

这么长怎么记呀?!

这里帮大家小结几个特点:

  • 成员变量 > 代码块 > 构造方法(构造器)。
  • 静态(共有) > 非静态(私有)。
  • 子类静态 > 父类非静态(私有)。

1. 静态 > 非静态

当且仅当该类在程序中第一次被 new(是第一次被类加载器调用时)才会触发(不考虑永久代的回收),但只调用 Main.class 是不会触发的哟。
其实这也是 类优先于对象被加载 的体现。

2. 成员变量 > 成员方法 > 构造方法

  1. 可以这么理解,加载这整个类,需要先知道类具有哪些成员变量,并且这些属性初始化 (private String A = ""; 或者 private String A;) 完毕之后,这个类的对象才算是完整的。
  2. 其实 初始化非静态成员变量 就是 new 对象的准备工作之一,等效于一个不接受任何类外部参数的构造方法。非静态代码块也同理。因此,成员变量 > 非静态代码块 > 构造方法。

3. 子类静态 > 父类非静态

结合第一条,也比较容易得出这一条规律。

测试代码如下:

/**
 * @author Ander.Li
 */
public class Main {

 static class A {
  static Hi hi = new Hi("A");

  Hi hi2 = new Hi("A2");

                // 静态代码块
  static {
   System.out.println("A static");
  }

                // 非静态代码块
  {
   System.out.println("A non static");
  }

  public A() {
   System.out.println("A init");
  }
 }

        // B 是 A 的子类
 static class B extends A {
  static Hi hi = new Hi("B");

  Hi hi2 = new Hi("B2");

                // 静态代码块
  static {
   System.out.println("B static");
  }

                // 非静态代码块
  {
   System.out.println("B non static");
  }

  public B() {
   System.out.println("B init");
  }
 }

 static class Hi {
  public Hi(String str) {
   System.out.println("Hi " + str);
  }
 }

 public static void main(String[] args) {
  System.out.println("[First] new B:");
  B b = new B();
  System.out.println();
  System.out.println("[Second] new B:");
  b = new B();
 }
}

运行结果如下:

[First] new B:
Hi A
A static
Hi B
B static
Hi A2
A non static
A init
Hi B2
B non static
B init

[Second] new B:
Hi A2
A non static
A init
Hi B2
B non static
B init

到此这篇关于Java父子类加载顺序的实现的文章就介绍到这了,更多相关Java父子类加载顺序内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Java/Android 相关文章推荐
解析Java异步之call future
Jun 14 Java/Android
springboot利用redis、Redisson处理并发问题的操作
Jun 18 Java/Android
Netty结合Protobuf进行编解码的方法
Jun 26 Java/Android
Java elasticsearch安装以及部署教程
Jun 28 Java/Android
springboot 启动如何排除某些bean的注入
Aug 02 Java/Android
SSM项目使用拦截器实现登录验证功能
Jan 22 Java/Android
alibaba seata服务端具体实现
Feb 24 Java/Android
使用Java去实现超市会员管理系统
Mar 18 Java/Android
JavaWeb实现显示mysql数据库数据
Mar 19 Java/Android
JavaScript正则表达式实现注册信息校验功能
May 30 Java/Android
Java Spring Boot请求方式与请求映射过程分析
Jun 25 Java/Android
JDK8中String的intern()方法实例详细解读
Sep 23 Java/Android
浅谈spring boot使用thymeleaf版本的问题
Aug 04 #Java/Android
Java后台生成图片的完整步骤
Aug 04 #Java/Android
在Spring-Boot中如何使用@Value注解注入集合类
Aug 02 #Java/Android
SpringBoot整合RabbitMQ的5种模式实战
Log4j.properties配置及其使用
Aug 02 #Java/Android
一篇文章带你学习Mybatis-Plus(新手入门)
Spring Boot 排除某个类加载注入IOC的操作
Aug 02 #Java/Android
You might like
PHP+APACHE实现用户论证的方法
2006/10/09 PHP
php文件缓存类用法实例分析
2015/04/22 PHP
PHP批量去除BOM头代码分享
2015/06/26 PHP
基于命令行执行带参数的php脚本并取得参数的方法
2016/01/25 PHP
PHP书写格式详解(必看)
2016/05/23 PHP
PHP入门教程之自定义函数用法详解(创建,调用,变量,参数,返回值等)
2016/09/11 PHP
IE图片缓存document.execCommand("BackgroundImageCache",false,true)
2011/03/01 Javascript
基于BootStrap Metronic开发框架经验小结【五】Bootstrap File Input文件上传插件的用法详解
2016/05/12 Javascript
bootstrap datepicker 与bootstrapValidator同时使用时选择日期后无法正常触发校验的解决思路
2016/09/28 Javascript
JS实现iframe自适应高度的方法示例
2017/01/07 Javascript
详解vue模拟加载更多功能(数据追加)
2017/06/23 Javascript
H5基于iScroll实现下拉刷新和上拉加载更多
2017/07/18 Javascript
node前端模板引擎Jade之标签的基本写法
2018/05/11 Javascript
vue中动态设置meta标签和title标签的方法
2018/07/11 Javascript
Node.js API详解之 os模块用法实例分析
2020/05/06 Javascript
JavaScript enum枚举类型定义及使用方法
2020/05/15 Javascript
Python中的闭包实例详解
2014/08/29 Python
使用Python的内建模块collections的教程
2015/04/28 Python
tensorflow 输出权重到csv或txt的实例
2018/06/14 Python
详解Django将秒转换为xx天xx时xx分
2019/09/27 Python
python实现简单飞行棋
2020/02/06 Python
解决运行django程序出错问题 'str'object has no attribute'_meta'
2020/07/15 Python
python 进程池pool使用详解
2020/10/15 Python
使用python操作lmdb对数据读取的实例
2020/12/11 Python
菲律宾购物网站:Lazada菲律宾
2018/04/05 全球购物
音乐学个人的自荐书范文
2013/11/26 职场文书
秘书行业自我鉴定范文
2013/12/30 职场文书
安全检查与奖惩制度
2014/01/23 职场文书
经贸日语专业个人求职信范文
2014/04/29 职场文书
社区关爱留守儿童活动方案
2014/08/22 职场文书
委托证明书
2014/09/17 职场文书
地下停车场租赁协议范本
2014/10/07 职场文书
自定义函数实现单词排序并运用于PostgreSQL(实现代码)
2021/04/22 PostgreSQL
vue实现列表垂直无缝滚动
2022/04/08 Vue.js
Windows 64位 安装 mysql 8.0.28 图文教程
2022/04/19 MySQL
python数字图像处理:图像简单滤波
2022/06/28 Python