浅谈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实现多线程聊天室
Jun 26 Java/Android
Java 中的 Unsafe 魔法类的作用大全
Jun 26 Java/Android
解决Swagger2返回map复杂结构不能解析的问题
Jul 02 Java/Android
使用@Value值注入及配置文件组件扫描
Jul 09 Java/Android
java多态注意项小结
Oct 16 Java/Android
Java异常处理try catch的基本用法
Dec 06 Java/Android
Java9新特性之Module模块化编程示例演绎
Mar 16 Java/Android
Android Flutter实现3D动画效果示例详解
Apr 07 Java/Android
JAVA 线程池(池化技术)的实现原理
Apr 28 Java/Android
利用Java连接Hadoop进行编程
Jun 28 Java/Android
IDEA中sout快捷键无效问题的解决方法
Jul 23 Java/Android
Java Spring读取和存储详细操作
Aug 05 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
数据库相关问题
2006/10/09 PHP
php中截取中文字符串的代码小结
2011/07/17 PHP
PHP禁止页面缓存的代码
2011/10/23 PHP
浅析memcache启动以及telnet命令详解
2013/06/28 PHP
PHP实现自动登入google play下载app report的方法
2014/09/23 PHP
PHP将字符串首字母大小写转换的实例
2017/01/21 PHP
escape、encodeURI、encodeURIComponent等方法的区别比较
2006/12/27 Javascript
js调用flash的效果代码
2008/04/26 Javascript
JavaScript QueryString解析类代码
2010/01/17 Javascript
深入理解JavaScript系列(4) 立即调用的函数表达式
2012/01/15 Javascript
尝试在让script的type属性等于text/html
2013/01/15 Javascript
extjs render 用法介绍
2013/09/11 Javascript
js弹窗返回值详解(window.open方式)
2014/01/11 Javascript
超简单JS二级、多级联动的简单实例
2014/02/18 Javascript
JavaScript的21条基本知识点
2014/03/04 Javascript
jquery实现textarea 高度自适应
2015/03/11 Javascript
利用jquery获取select下拉框的值
2016/11/23 Javascript
Vue-Router实现页面正在加载特效方法示例
2017/02/12 Javascript
js中apply和Math.max()函数的问题及区别介绍
2018/03/27 Javascript
vue中的数据绑定原理的实现
2018/07/02 Javascript
重学JS 系列:聊聊继承(推荐)
2019/04/11 Javascript
python远程登录代码
2008/04/29 Python
python判断一个集合是否包含了另外一个集合中所有项的方法
2015/06/30 Python
浅谈pandas中Dataframe的查询方法([], loc, iloc, at, iat, ix)
2018/04/10 Python
Python爬虫之UserAgent的使用实例
2019/02/21 Python
Pytorch 搭建分类回归神经网络并用GPU进行加速的例子
2020/01/09 Python
keras topN显示,自编写代码案例
2020/07/03 Python
最耐用行李箱,一箱永流传:Briggs & Riley(全球终身保修)
2017/12/07 全球购物
Beauty Expert美国/加拿大:购买奢侈美容产品
2018/12/05 全球购物
幼儿园中秋节活动方案2013
2014/01/29 职场文书
群众路线领导班子四风对照检查材料
2014/09/27 职场文书
2014年六五普法工作总结
2014/11/25 职场文书
2015年个人现实表现材料
2014/12/10 职场文书
离婚案件被告代理词
2015/05/23 职场文书
Python初识逻辑与if语句及用法大全
2021/08/07 Python
Python多线程实用方法以及共享变量资源竞争问题
2022/04/12 Python