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.   static {
  21.     System.out.println("我是超级父类 A 的静态代码块");
  22.   }
  23.  
  24.   // 普通代码块
  25.   {
  26.     System.out.println("我是超级父类 A 的普通代码块");
  27.   }
  28.  
  29.   // 无参构造方法
  30.   public A() {
  31.     System.out.println("我是超级父类 A 的无参构造方法");
  32.   }
  33. }

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.   static {
  20.     System.out.println("我是父类 B 的静态代码块");
  21.   }
  22.  
  23.   // 普通代码块
  24.   {
  25.     System.out.println("我是父类 B 的普通代码块");
  26.   }
  27.  
  28.   // 无参构造方法
  29.   public B() {
  30.     System.out.println("我是父类 B 的无参构造方法");
  31.   }
  32. }

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.   static {
  21.     System.out.println("我是子类 C 的静态代码块");
  22.   }
  23.  
  24.   // 普通代码块
  25.   {
  26.   System.out.println("我是子类 C 的普通代码块");
  27.   }
  28.  
  29.   // 无参构造方法
  30.   public C() {
  31.     System.out.println("我是子类 C 的无参构造方法");
  32.   }
  33. }

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.     System.out.println("我是超级父类 A 的普通成员变量 AA 的普通代码块");
  19.   }
  20.  
  21.   // 无参构造方法
  22.   public AA() {
  23.     System.out.println("我是超级父类 A 的普通成员变量 AA 的无参构造方法");
  24.   }
  25. }

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.     System.out.println("我是超级父类 A 的静态成员变量 AAA 的普通代码块");
  19.   }
  20.  
  21.   // 无参构造方法
  22.   public AAA() {
  23.     System.out.println("我是超级父类 A 的静态成员变量 AAA 的无参构造方法");
  24.   }
  25. }

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.     System.out.println("我是父类 B 的普通成员变量 BB 的普通代码块");
  19.   }
  20.  
  21.   // 无参构造方法
  22.   public BB() {
  23.     System.out.println("我是父类 B 的普通成员变量 BB 的无参构造方法");
  24.   }
  25. }

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.     System.out.println("我是父类 B 的静态成员变量 BBB 的普通代码块");
  19.   }
  20.  
  21.   // 无参构造方法
  22.   public BBB() {
  23.     System.out.println("我是父类 B 的静态成员变量 BBB 的无参构造方法");
  24.   }
  25. }

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.     System.out.println("我是子类 C 的普通成员变量 CC 的普通代码块");
  19.   }
  20.  
  21.   // 无参构造方法
  22.   public CC() {
  23.     System.out.println("我是子类 C 的普通成员变量 CC 的无参构造方法");
  24.   }
  25. }

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.     System.out.println("我是子类 C 的静态成员变量 CCC 的普通代码块");
  19.   }
  20.  
  21.   // 无参构造方法
  22.   public CCC() {
  23.     System.out.println("我是子类 C 的静态成员变量 CCC 的无参构造方法");
  24.   }
  25. }

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 的无参构造方法

总结:

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

Java 的类加载顺序的更多相关文章

  1. java中类加载顺序(深入Java)

    未涉及虚拟机 0.<init>与<clinit>的区别 1.类的加载过程 2.类的使用方式 3.类的加载来源 4.重载之泛型参数不同可以吗 5.参考 引子 记得上次中秋一哥们写 ...

  2. Java面试--类加载顺序

    类什么时候就行初始化: 1)创建类的实例,也就是new一个对象  2)访问某个类或接口的静态变量,或者对该静态变量赋值  3)调用类的静态方法  4)反射(Class.forName(“com.fan ...

  3. tomcat6类加载器与类加载顺序

    tomcat6.0.32 com.dyyx.ShareUtils//返回系统当前时间public static String now(); package com.dyyx;import java.t ...

  4. Java虚拟机类加载机制——案例分析

    转载: Java虚拟机类加载机制--案例分析   在<Java虚拟机类加载机制>一文中详细阐述了类加载的过程,并举了几个例子进行了简要分析,在文章的最后留了一个悬念给各位,这里来揭开这个悬 ...

  5. Java 的类加载机制

    Java 的类加载机制 来源 https://www.cnblogs.com/xiaoxi/p/6959615.html 一.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内 ...

  6. JAVA的初始化顺序:

    JAVA的初始化顺序: 父类的静态成员初始化>父类的静态代码块>子类的静态成员初始化>子类的静态代码块>父类的代码块>父类的构造方法>子类的代码块>子类的构造 ...

  7. 深入理解Java虚拟机---类加载机制(简略版)

    类加载机制 谈起类加载机制,在这里说个题外话,当初本人在学了两三个月的Java后,只了解了一些皮毛知识,就屁颠屁颠得去附近学校的招聘会去蹭蹭面试经验,和HR聊了一会后开始了技术面试,前抛出了两个简单的 ...

  8. Java变量、Java对象初始化顺序

    局部变量与成员变量: 局部变量分为: 行参:在方法签名中定义的局部变量,随方法的结束而凋亡. 方法内的局部变量:必须在方法内对其显示初始化,从初始化后开始生效,随方法的结束而凋亡. 代码块内的局部变量 ...

  9. ClassLoader Java中类加载出现在哪个阶段,编译期和运行期? 类加载和类装载是一样的吗

    1.ClassLoader Java中类加载出现在哪个阶段,编译期和运行期? 类加载和类装载是一样的吗? :当然是运行期间啊,我自己有个理解误区,改正后如下:编译期间编译器是不去加载类的,只负责编译而 ...

随机推荐

  1. Ajax异步请求struts的JSON机制(省市区三级联动)

    1.struts.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts P ...

  2. pytorch梯度裁剪(Clipping Gradient):torch.nn.utils.clip_grad_norm

    torch.nn.utils.clip_grad_norm(parameters, max_norm, norm_type=2) 1.梯度裁剪原理(http://blog.csdn.net/qq_29 ...

  3. Office DDE漏洞学习笔记

    1.前言 2017年下半年爆发出来的Office漏洞,一直没有空做笔记记录.在病毒分析中也看到有利用这个漏洞的样本,针对Office系列软件发起的钓鱼攻击和APT攻击一直是安全攻防的热点. 2.off ...

  4. 深入理解MySQL的并发控制、锁和事务【转】

    本文主要是针对MySQL/InnoDB的并发控制和加锁技术做一个比较深入的剖析,并且对其中涉及到的重要的概念,如多版本并发控制(MVCC),脏读(dirty read),幻读(phantom read ...

  5. C# 读取指定文件夹下所有文件

    #region 读取文件 //返回指定目录中的文件的名称(绝对路径) string[] files = System.IO.Directory.GetFiles(@"D:\Test" ...

  6. c# 通过Windows服务启动外部程序

    1. 新建一个Windows服务应用程序 创建项目——>Visual C# 左侧的"+"——>Windows ——>Windows 服务(右侧模板)——>输 ...

  7. Jenkins无法安装插件或首次安装插件界面提示Offline

    一.首先点击系统管理 二.点击插件管理 三.选择高级管理 四.将升级站点中的https改成http即可

  8. Python开发环境(3):使用Eclipse+PyDev插件创建Django项目

    OS:Windows 10家庭中文版,Python:3.6,Eclipse:Oxygen.1a Release (4.7.1a), PyDev:6.3.2,Django:2.0.3 本文展示了怎么使用 ...

  9. python网络编程--事件驱动模型

    论事件驱动与异步IO 事件驱动模型:根据事件的触发去干什么事,就是根据一个事件做反应 原文:http://www.cnblogs.com/alex3714/articles/5248247.html常 ...

  10. C# listView subitem 问本值 text 改变 界面会闪烁

    解决方法 就是重写ListView,然后设置双缓冲即可,然后再使用DoubleBufferListView,就不会闪烁了.下面的代码是DoubleBufferListView,并使用FrmMain来测 ...