Java 的类加载顺序
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 的类加载顺序的更多相关文章
- java中类加载顺序(深入Java)
未涉及虚拟机 0.<init>与<clinit>的区别 1.类的加载过程 2.类的使用方式 3.类的加载来源 4.重载之泛型参数不同可以吗 5.参考 引子 记得上次中秋一哥们写 ...
- Java面试--类加载顺序
类什么时候就行初始化: 1)创建类的实例,也就是new一个对象 2)访问某个类或接口的静态变量,或者对该静态变量赋值 3)调用类的静态方法 4)反射(Class.forName(“com.fan ...
- tomcat6类加载器与类加载顺序
tomcat6.0.32 com.dyyx.ShareUtils//返回系统当前时间public static String now(); package com.dyyx;import java.t ...
- Java虚拟机类加载机制——案例分析
转载: Java虚拟机类加载机制--案例分析 在<Java虚拟机类加载机制>一文中详细阐述了类加载的过程,并举了几个例子进行了简要分析,在文章的最后留了一个悬念给各位,这里来揭开这个悬 ...
- Java 的类加载机制
Java 的类加载机制 来源 https://www.cnblogs.com/xiaoxi/p/6959615.html 一.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内 ...
- JAVA的初始化顺序:
JAVA的初始化顺序: 父类的静态成员初始化>父类的静态代码块>子类的静态成员初始化>子类的静态代码块>父类的代码块>父类的构造方法>子类的代码块>子类的构造 ...
- 深入理解Java虚拟机---类加载机制(简略版)
类加载机制 谈起类加载机制,在这里说个题外话,当初本人在学了两三个月的Java后,只了解了一些皮毛知识,就屁颠屁颠得去附近学校的招聘会去蹭蹭面试经验,和HR聊了一会后开始了技术面试,前抛出了两个简单的 ...
- Java变量、Java对象初始化顺序
局部变量与成员变量: 局部变量分为: 行参:在方法签名中定义的局部变量,随方法的结束而凋亡. 方法内的局部变量:必须在方法内对其显示初始化,从初始化后开始生效,随方法的结束而凋亡. 代码块内的局部变量 ...
- ClassLoader Java中类加载出现在哪个阶段,编译期和运行期? 类加载和类装载是一样的吗
1.ClassLoader Java中类加载出现在哪个阶段,编译期和运行期? 类加载和类装载是一样的吗? :当然是运行期间啊,我自己有个理解误区,改正后如下:编译期间编译器是不去加载类的,只负责编译而 ...
随机推荐
- JavaScript数组的概念
数组 1.数组是什么? 数组就是一组变量存放在里面就是数组. 例如:var list=['apple','goole','alibaba',520] (1.这些数据有一些相关性的. ( ...
- 差分约束系统专题 && 对差分约束系统的理解
具体能解决的问题: 求最长路,最短路,或者判断解是否存在. 在建边的时候: 一般是给你区间减法的关系,或者是这个点到另一个点的关系.如果给你的关系是除法的话,我们可以通过使用两边同时取log的方式,将 ...
- AopProxyUtils.getSingletonTarget(Ljava/lang/Object;)Ljava/lang/Object;大坑
这个问题太坑了,试了好多个版本,都是依赖冲突导致的, https://blog.csdn.net/qq_15003505/article/details/78430595 最后找到这一篇博客解决了,就 ...
- Shell-help格式详解
前言 linux shell命令通常可以通过-h或--help来打印帮助说明,或者通过man命令来查看帮助,有时候我们也会给自己的程序写简单的帮助说明,其实帮助说明格式是有规律可循的 帮助示例 下面是 ...
- 002_Linux-Memory专题
一.单独查看某个进程的内存占用 pmap 736 | tail -n 1 二. 以前我对这块认识很模糊,而且还有错误的认识:今天由我同事提醒,所以我决定来好好的缕缕这块的关系. 图: -------- ...
- 教你用DrawLayout 实现Android 侧滑菜单
现在的APP越来越注重用户体验,百度视频客户端有一个特效还是挺吸引人的,在主界面手指向右滑动,就可以将菜单展示出来,而主界面会被隐藏大部分,但是仍有左侧的一小部分同菜单一起展示.类似的还有天天动听,人 ...
- CCScale9Sprite 的 setContentSize setPreferredSize 区别
CCScale9Sprite 设置图片大小方式: updateButtonSpriteMark->setContentSize(size);//设置图片的原始大小设置节点的未转换大小.无论节点被 ...
- python基础-类的反射
1)反射是通过字符串方式映射内存中的对象. python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr, 改四个函数分别用于对对象内部执行:检查是 ...
- MySQL学习笔记:concat、concat_ws、group_concat —— 字符串连接
在MySQL中,实现字符串拼接主要有以下3种函数: concat(x,y,...) concat_ws(分隔符,x,y,...) group_concat(distinct xxx order by ...
- ObjectInputStream与ObjectOutputStream
雇员类 package io; import java.io.Serializable; @SuppressWarnings("serial") public class Emp ...