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

 package cn.com.zfc.lesson05.inherit01;

 /**
*
* @title A
* @describe 超级父类 A
* @author 张富昌
* @date 2017年4月3日下午5:59:17
*/
public class A {   //普通成员变量   private AA aa = new AA();   //静态成员变量
  private static AAA aaa = new AAA();   // 静态代码块
  static {
    System.out.println("我是超级父类 A 的静态代码块");
  }   // 普通代码块
  {
    System.out.println("我是超级父类 A 的普通代码块");
  }   // 无参构造方法
  public A() {
    System.out.println("我是超级父类 A 的无参构造方法");
  }
}

2、父类B

 package cn.com.zfc.lesson05.inherit01;

 /**
*
* @title B
* @describe 父类
* @author 张富昌
* @date 2017年4月3日下午5:59:17
*/
public class B extends A {   //普通成员变量
  private BB bb = new BB();   //静态成员变量
  private static BBB bbb = new BBB();   // 静态代码块
  static {
    System.out.println("我是父类 B 的静态代码块");
  }   // 普通代码块
  {
    System.out.println("我是父类 B 的普通代码块");
  }   // 无参构造方法
  public B() {
    System.out.println("我是父类 B 的无参构造方法");
  }
}

3、子类C

 package cn.com.zfc.lesson05.inherit01;

 /**
*
* @title C
* @describe 子类 C
* @author 张富昌
* @date 2017年4月3日下午5:59:17
*/
public class C extends B {   //普通成员变量   private CC cc = new CC();   //静态成员变量
  private static CCC ccc = new CCC();   // 静态代码块
  static {
    System.out.println("我是子类 C 的静态代码块");
  }   // 普通代码块
  {
  System.out.println("我是子类 C 的普通代码块");
  }   // 无参构造方法
  public C() {
    System.out.println("我是子类 C 的无参构造方法");
  }
}

4、AA类

 package cn.com.zfc.lesson05.inherit01;

 /**
*
* @title AA
* @describe 超级父类 A 的普通成员变量 AA
* @author 张富昌
* @date 2017年4月3日下午5:59:17
*/
public class AA {
  // 静态代码块
  static {
    System.out.println("我是超级父类 A 的普通成员变量 AA 的静态代码块");
  }   // 普通代码块
  {
    System.out.println("我是超级父类 A 的普通成员变量 AA 的普通代码块");
  }   // 无参构造方法
  public AA() {
    System.out.println("我是超级父类 A 的普通成员变量 AA 的无参构造方法");
  }
}

5、AAA类

 package cn.com.zfc.lesson05.inherit01;

 /**
*
* @title AAA
* @describe 超级父类 A 的静态成员变量 AAA
* @author 张富昌
* @date 2017年4月3日下午5:59:17
*/
public class AAA {
  // 静态代码块
  static {
    System.out.println("我是超级父类 A 的静态成员变量 AAA 的静态代码块");
  }   // 普通代码块
  {
    System.out.println("我是超级父类 A 的静态成员变量 AAA 的普通代码块");
  }   // 无参构造方法
  public AAA() {
    System.out.println("我是超级父类 A 的静态成员变量 AAA 的无参构造方法");
  }
}

6、BB类

 package cn.com.zfc.lesson05.inherit01; 

 /**
*
* @title BB
* @describe 父类 B 的普通成员变量 BB
* @author 张富昌
* @date 2017年4月3日下午5:59:17
*/
public class BB {
  // 静态代码块
  static {
    System.out.println("我是父类 B 的普通成员变量 BB 的静态代码块");
  }   // 普通代码块
  {
    System.out.println("我是父类 B 的普通成员变量 BB 的普通代码块");
  }   // 无参构造方法
  public BB() {
    System.out.println("我是父类 B 的普通成员变量 BB 的无参构造方法");
  }
}

7、BBB类

 package cn.com.zfc.lesson05.inherit01;

 /**
*
* @title BBB
* @describe 父类 B 的静态成员变量 BBB
* @author 张富昌
* @date 2017年4月3日下午5:59:17
*/
public class BBB {
  // 静态代码块
  static {
    System.out.println("我是父类 B 的静态成员变量 BBB 的静态代码块");
  }   // 普通代码块
  {
    System.out.println("我是父类 B 的静态成员变量 BBB 的普通代码块");
  }   // 无参构造方法
  public BBB() {
    System.out.println("我是父类 B 的静态成员变量 BBB 的无参构造方法");
  }
}

8、CC类

 package cn.com.zfc.lesson05.inherit01;

 /**
*
* @title CC
* @describe 子类 C 的普通成员变量 CC
* @author 张富昌
* @date 2017年4月3日下午5:59:17
*/
public class CC {
  // 静态代码块
  static {
    System.out.println("我是子类 C 的普通成员变量 CC 的静态代码块");
  }   // 普通代码块
  {
    System.out.println("我是子类 C 的普通成员变量 CC 的普通代码块");
  }   // 无参构造方法
  public CC() {
    System.out.println("我是子类 C 的普通成员变量 CC 的无参构造方法");
  }
}

9、CCC类

 package cn.com.zfc.lesson05.inherit01;

 /**
*
* @title CCC
* @describe 子类 C 的静态成员变量 CCC
* @author 张富昌
* @date 2017年4月3日下午5:59:17
*/
public class CCC {
  // 静态代码块
  static {
    System.out.println("我是子类 C 的静态成员变量 CCC 的静态代码块");
  }   // 普通代码块
  {
    System.out.println("我是子类 C 的静态成员变量 CCC 的普通代码块");
  }   // 无参构造方法
  public CCC() {
    System.out.println("我是子类 C 的静态成员变量 CCC 的无参构造方法");
  }
}

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

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

三、测试结果

我是超级父类 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. vue、入门

    入门vue v-on:click:chang   绑定事件点击 生面周期,整个vue的执行过程,他的应用执行了生面周期,也就是执行过程,这个执行过程如下图表,我们可以参考下图,也可以访问官方网址:ht ...

  2. http方式传递参数值转义或乱码的处理(base64)

    如果通过http方式传递参数url编码了,可用urlEncode和urlDecode,这种方式不同开发语言编码出来的可能不同,所以不同开发语言最好用base64编码和解码来处理: base64加密: ...

  3. JS设计模式——8.桥接模式

    桥接模式的用途 在实现API的时候,桥接模式非常有用. 在设计一个JavaScript API的时候,可以用这个模式来弱化它与使用它的类和对象之间的耦合. 示例:事件监听器 桥接模式最常见和实际的应用 ...

  4. aarch64_n2

    nodejs-is-dotfile-1.0.2-2.fc26.noarch.rpm 2017-02-12 00:27 9.5K fedora Mirroring Project nodejs-is-e ...

  5. python hash()和hashlib

    一.哈希算法 哈希算法:哈希算法并不是特定的算法而是一类算法的统称,只要是完成这种功能的算法都是哈希算法,哈希算法也叫做散列算法.同时这个过程是不可逆的,无法由key推导出data.判断一个哈希算法是 ...

  6. MongoDB(3.6.3)的用户认证初识

    Windows 10家庭中文版,MongoDB 3.6.3, 前言 刚刚安装好了MongoDB,启动了服务器-mongod命令,启动了MongoDB shell-mongo命令,不过,全程都没有使用u ...

  7. yum命令安装软件时,出现--centos 7 安装apache 出现 Could not resolve host: mirrorlist.centos.org; 未知的错误"--CentOS网络设置 couldn't resolve host 'mirrorlist.centos.org问题解决

    CentOS网络设置 couldn't resolve host 'mirrorlist.centos.org问题解决 今天在虚拟机上安装完CentOS6.5之后,首次使用时yum命令安装软件时,出现 ...

  8. 基于gRpc的远程服务框架

    作为一个新搭建的软件团队,底层技术尤为重要.为了以后更好的面向不同的项目需求,满足不断变化的需求,决定着手搭建一套RPC系统.为了更好的兼容以后部门其他语言的使用,选择了开源框架gRpc. gRpc ...

  9. 洛谷P1938 找工就业

    传送门啦 这个题本质就是跑一边最长路,重点就是在怎么建图上. 我们可以把点权放到边权上面,即将每一个边的终点点权当做这个边的边权,这个题里就是将工钱 $ d $ 当做边权. 如果这一条边需要坐飞机才能 ...

  10. putIfAbsent

    public static HashSet<Long> getOrInitHashMapCacheValue(Long mId){ // HashSet<Long> set = ...