Java 的类加载顺序

一、加载顺序:先父类后子类,先静态后普通

1、父类的静态成员变量初始化

2、父类的静态代码块

3、子类的静态成员变量初始化

4、子类的静态代码块

5、父类的普通成员变量初始化

6、父类的普通代码块

7、父类的无参构造器

8、子类的普通成员变量

9、子类的普通代码块

10、子类的无参构造器

二、示例代码

  超级父类A,父类B,子类C,B继承A,C继承B;

  AA、AAA、BB、BBB、CC、CCC都有各自的普通、静态成员变量,普通、静态代码块和无参构造器

  超级父类A的普通成员变量aa(AA类的实例),超级父类A的静态成员变量aaa(AAA类的实例);

  父类B的普通成员变量bb(BB类的实例),父类B的静态成员变量bbb(BBB类的实例);

  子类C的普通成员变量cc(CC类的实例),子类C的静态成员变量ccc(CCC类的实例);

1、超级父类A

 1 package cn.com.zfc.lesson05.inherit01;
 2
 3 /**
 4 *
 5 * @title A
 6 * @describe 超级父类 A
 7 * @author 张富昌
 8 * @date 2017年4月3日下午5:59:17
 9 */
10 public class A {
11
12   //普通成员变量
13
14   private AA aa = new AA();
15
16   //静态成员变量
17   private static AAA aaa = new AAA();
18
19
20
21   // 静态代码块
22   static {
23     System.out.println("我是超级父类 A 的静态代码块");
24   }
25
26
27
28   // 普通代码块
29   {
30     System.out.println("我是超级父类 A 的普通代码块");
31   }
32
33
34
35   // 无参构造方法
36   public A() {
37     System.out.println("我是超级父类 A 的无参构造方法");
38   }
39 }

2、父类B

 1 package cn.com.zfc.lesson05.inherit01;
 2
 3 /**
 4 *
 5 * @title B
 6 * @describe 父类
 7 * @author 张富昌
 8 * @date 2017年4月3日下午5:59:17
 9 */
10 public class B extends A {
11
12   //普通成员变量
13   private BB bb = new BB();
14
15   //静态成员变量
16   private static BBB bbb = new BBB();
17
18
19
20   // 静态代码块
21   static {
22     System.out.println("我是父类 B 的静态代码块");
23   }
24
25
26
27   // 普通代码块
28   {
29     System.out.println("我是父类 B 的普通代码块");
30   }
31
32
33
34   // 无参构造方法
35   public B() {
36     System.out.println("我是父类 B 的无参构造方法");
37   }
38 }

3、子类C

 1 package cn.com.zfc.lesson05.inherit01;
 2
 3 /**
 4 *
 5 * @title C
 6 * @describe 子类 C
 7 * @author 张富昌
 8 * @date 2017年4月3日下午5:59:17
 9 */
10 public class C extends B {
11
12   //普通成员变量
13
14   private CC cc = new CC();
15
16   //静态成员变量
17   private static CCC ccc = new CCC();
18
19
20   // 静态代码块
21   static {
22     System.out.println("我是子类 C 的静态代码块");
23   }
24
25
26
27   // 普通代码块
28   {
29   System.out.println("我是子类 C 的普通代码块");
30   }
31
32
33
34   // 无参构造方法
35   public C() {
36     System.out.println("我是子类 C 的无参构造方法");
37   }
38 }

4、AA类

 1 package cn.com.zfc.lesson05.inherit01;
 2
 3 /**
 4 *
 5 * @title AA
 6 * @describe 超级父类 A 的普通成员变量 AA
 7 * @author 张富昌
 8 * @date 2017年4月3日下午5:59:17
 9 */
10 public class AA {
11   // 静态代码块
12   static {
13     System.out.println("我是超级父类 A 的普通成员变量 AA 的静态代码块");
14   }
15
16
17
18   // 普通代码块
19   {
20     System.out.println("我是超级父类 A 的普通成员变量 AA 的普通代码块");
21   }
22
23
24
25   // 无参构造方法
26   public AA() {
27     System.out.println("我是超级父类 A 的普通成员变量 AA 的无参构造方法");
28   }
29 }

5、AAA类

 1 package cn.com.zfc.lesson05.inherit01;
 2
 3 /**
 4 *
 5 * @title AAA
 6 * @describe 超级父类 A 的静态成员变量 AAA
 7 * @author 张富昌
 8 * @date 2017年4月3日下午5:59:17
 9 */
10 public class AAA {
11   // 静态代码块
12   static {
13     System.out.println("我是超级父类 A 的静态成员变量 AAA 的静态代码块");
14   }
15
16
17
18   // 普通代码块
19   {
20     System.out.println("我是超级父类 A 的静态成员变量 AAA 的普通代码块");
21   }
22
23
24
25   // 无参构造方法
26   public AAA() {
27     System.out.println("我是超级父类 A 的静态成员变量 AAA 的无参构造方法");
28   }
29 }

6、BB类

 1 package cn.com.zfc.lesson05.inherit01;
 2
 3 /**
 4 *
 5 * @title BB
 6 * @describe 父类 B 的普通成员变量 BB
 7 * @author 张富昌
 8 * @date 2017年4月3日下午5:59:17
 9 */
10 public class BB {
11   // 静态代码块
12   static {
13     System.out.println("我是父类 B 的普通成员变量 BB 的静态代码块");
14   }
15
16
17
18   // 普通代码块
19   {
20     System.out.println("我是父类 B 的普通成员变量 BB 的普通代码块");
21   }
22
23
24
25   // 无参构造方法
26   public BB() {
27     System.out.println("我是父类 B 的普通成员变量 BB 的无参构造方法");
28   }
29 }

7、BBB类

 1 package cn.com.zfc.lesson05.inherit01;
 2
 3 /**
 4 *
 5 * @title BBB
 6 * @describe 父类 B 的静态成员变量 BBB
 7 * @author 张富昌
 8 * @date 2017年4月3日下午5:59:17
 9 */
10 public class BBB {
11   // 静态代码块
12   static {
13     System.out.println("我是父类 B 的静态成员变量 BBB 的静态代码块");
14   }
15
16
17
18   // 普通代码块
19   {
20     System.out.println("我是父类 B 的静态成员变量 BBB 的普通代码块");
21   }
22
23
24
25   // 无参构造方法
26   public BBB() {
27     System.out.println("我是父类 B 的静态成员变量 BBB 的无参构造方法");
28   }
29 }

8、CC类

 1 package cn.com.zfc.lesson05.inherit01;
 2
 3 /**
 4 *
 5 * @title CC
 6 * @describe 子类 C 的普通成员变量 CC
 7 * @author 张富昌
 8 * @date 2017年4月3日下午5:59:17
 9 */
10 public class CC {
11   // 静态代码块
12   static {
13     System.out.println("我是子类 C 的普通成员变量 CC 的静态代码块");
14   }
15
16
17
18   // 普通代码块
19   {
20     System.out.println("我是子类 C 的普通成员变量 CC 的普通代码块");
21   }
22
23
24
25   // 无参构造方法
26   public CC() {
27     System.out.println("我是子类 C 的普通成员变量 CC 的无参构造方法");
28   }
29 }

9、CCC类

 1 package cn.com.zfc.lesson05.inherit01;
 2
 3 /**
 4 *
 5 * @title CCC
 6 * @describe 子类 C 的静态成员变量 CCC
 7 * @author 张富昌
 8 * @date 2017年4月3日下午5:59:17
 9 */
10 public class CCC {
11   // 静态代码块
12   static {
13     System.out.println("我是子类 C 的静态成员变量 CCC 的静态代码块");
14   }
15
16
17
18   // 普通代码块
19   {
20     System.out.println("我是子类 C 的静态成员变量 CCC 的普通代码块");
21   }
22
23
24
25   // 无参构造方法
26   public CCC() {
27     System.out.println("我是子类 C 的静态成员变量 CCC 的无参构造方法");
28   }
29 }

10、测试子类C的创建过程:TestC.java

 1 package cn.com.zfc.lesson05.inherit01;
 2 /**
 3 *
 4 * @title TestC
 5 * @describe 测试子类C的创建过程
 6 * @author 张富昌
 7 * @date 2017年4月3日下午6:49:50
 8 */
 9 public class TestC {
10   public static void main(String[] args) {
11
12     //创建 C 对象
13     C c = new C();
14   }
15 }

三、测试结果

我是超级父类 A 的静态成员变量 AAA 的静态代码块
我是超级父类 A 的静态成员变量 AAA 的普通代码块
我是超级父类 A 的静态成员变量 AAA 的无参构造方法
我是超级父类 A 的静态代码块
我是父类 B 的静态成员变量 BBB 的静态代码块
我是父类 B 的静态成员变量 BBB 的普通代码块
我是父类 B 的静态成员变量 BBB 的无参构造方法
我是父类 B 的静态代码块
我是子类 C 的静态成员变量 CCC 的静态代码块
我是子类 C 的静态成员变量 CCC 的普通代码块
我是子类 C 的静态成员变量 CCC 的无参构造方法
我是子类 C 的静态代码块
我是超级父类 A 的普通成员变量 AA 的静态代码块
我是超级父类 A 的普通成员变量 AA 的普通代码块
我是超级父类 A 的普通成员变量 AA 的无参构造方法
我是超级父类 A 的普通代码块
我是超级父类 A 的无参构造方法
我是父类 B 的普通成员变量 BB 的静态代码块
我是父类 B 的普通成员变量 BB 的普通代码块
我是父类 B 的普通成员变量 BB 的无参构造方法
我是父类 B 的普通代码块
我是父类 B 的无参构造方法
我是子类 C 的普通成员变量 CC 的静态代码块
我是子类 C 的普通成员变量 CC 的普通代码块
我是子类 C 的普通成员变量 CC 的无参构造方法
我是子类 C 的普通代码块
我是子类 C 的无参构造方法

总结:

  第一点,所有的类都会优先加载基类
  第二点,静态成员的初始化优先
  第三点,成员初始化后,才会执行构造方法
  第四点,静态成员的初始化与静态块的执行,发生在类加载的时候。
  第四点,类对象的创建以及静态块的访问,都会触发类的加载。

转载于:https://www.cnblogs.com/zfc-java/p/6662416.html

Java 的类加载顺序相关推荐

  1. 关于 Java 同名类加载顺序问题排查方案

    排查背景 最近在生产上部署 UDF 时,遇到一个两个环境完全相同,但是一个客户端报错另一个正常的情况,经过多次调试问题终于得以解决,现将解决思路记录一下,希望能对后来者有所帮助.(生产环境不便于截图. ...

  2. java包引入顺序_多个相同jar存在时的引用顺序

    起因:今天一个aar包在测试环境中正常运行,使用soapui测试正常返回,在本地环境中运行则老是报数据库连接异常,经检查,是因为在运行时环境中缺少ojdbc相关的jar包引起的. 重新打了一个aar包 ...

  3. JAVA基础--final、static区别以及类加载顺序

    一.JAVA中final 与 static 总结 final static 修饰类 该类不可被继承 只能修饰内部类,该类不需要new,是静态加载(嵌套顶层类) 修饰接口 × × 修饰构造函数 × × ...

  4. Java类的加载及父类子类加载顺序

    点击 Mr.绵羊的知识星球 解锁更多优质文章. 目录 一.类的加载 1. 类加载 2. 类加载器 二.父类和子类加载顺序 1. 案例(代码) 一.类的加载 1. 类加载 当程序要使用某些类时,如果该类 ...

  5. java中parent结构_详解java中继承关系类加载顺序问题

    详解java中继承关系类加载顺序问题 实例代码: /** * Created by fei on 2017/5/31. */ public class SonClass extends ParentC ...

  6. JAVA静态内部类加载顺序

    今天偶然机会碰到了JAVA的静态内部类加载实例,原本以为和外部类一样,但实验结果确出人意料,特此记录.希望大牛们能指出原因所在. 首先给上代码: public class LoadTest2 {pub ...

  7. Java 类加载顺序与成员变量初始化

    类加载顺序 父类静态代码块(包括静态初始化块,静态属性,但不包括静态方法) 子类静态代码块(包括静态初始化块,静态属性,但不包括静态方法 ) 父类非静态代码块( 包括非静态初始化块,非静态属性 ) 父 ...

  8. Java类加载顺序之一条日志引发的血案

    目录 为什么是null 回顾类加载 原因 问题重现 总结 类加载顺序 子类重写被父类构造函数调用的函数注意 不能放过不起眼的日志 一条日志引发的案子 [11:12:58.505][D][Gen][RT ...

  9. Java的类加载机制

    jvm系列 垃圾回收基础 JVM的编译策略 GC的三大基础算法 GC的三大高级算法 GC策略的评价指标 JVM信息查看 GC通用日志解读 jvm的card table数据结构 Java类初始化顺序 J ...

最新文章

  1. 2)JS动态生成HTML元素的爬取
  2. 海量存储之十八–一致性和高可用专题
  3. mysql 嵌入式 c开发环境_【Linux】嵌入式C语言MySQL编程(libmysqlclient-dev使用)
  4. 企业级项目实战讲解!javamap排序规则
  5. java学习(178):终篇?静态代理?动态代理?
  6. 【今日CV 视觉论文速览】Wed, 6 Feb 2019
  7. 开源java项目_请问有哪些开源java项目值得学习的?学习完了容易找工作的?
  8. java判断long 大于0,JAVA的一道习题:找出五个大于Long.MAX_VALUE的素数
  9. 虚拟机网络连接模式中桥接模式和NAT模式的区别
  10. ArcGIS Engine中添加点、线、面元素
  11. PHP网站批量自动发外链工具源码
  12. 让SageMath方便使用的若干方法
  13. Python — sklearn 分类效果评估
  14. Windows域/域树/域林的简单区别
  15. java ppt转图片 解决图片不清晰问题,Java PowerPoint转图片,使用java操作ppt转图片
  16. Mac下编译WebRTC(Mac和iOS版本)
  17. Windows 下rsync同步数据报错7456
  18. 生命主题dreamweaver作业静态HTML网页设计——卫生与健康 6页 带视频
  19. 计算机硬盘灯不亮,解决办法:如果计算机硬盘驱动器指示灯不亮,该怎么办?解决电脑硬盘指示灯不亮的问题_IT / computer_资料...
  20. word太大怎么压缩变小,word压缩方法

热门文章

  1. 有关nginx location规则
  2. 一句white-space:nowrap解决IE6,IE7下浮动元素不自动换行
  3. 大型网站系统架构分析--转
  4. python之xlrd、xlwt学习
  5. MySQL时间增加、字符串拼接
  6. CSS3选择器 :read-only选择器 CSS3选择器 :read-write选择器
  7. js时间格式化函数,支持Unix时间戳
  8. Java 编程开始啦
  9. bzoj 4602: [Sdoi2016]齿轮
  10. Apache Kafka之设计