一、普通类的加载顺序
1、加载一个类时,其各模块的加载顺序。
public class Test { private static String aa = "静态属性"; private String bb = "普通属性"; { System.out.println("构造代码块"); } private Test(){ System.out.println("构造方法"); } static{ System.out.println("静态代码块"); } public static void main(String[] arg) { System.out.println("******"); Test test = new Test(); System.out.println("******"); } } |
静态代码块 ****** 构造代码块 构造方法 ****** |
结论:1、静态代码块、静态属性 2、构造块、构造方法 3、普通方法、普通属性
二、内部类的加载顺序
1、加载一个类时,其内部类是否同时被加载?下面我们做一个实验来看一下。
- public class Outer {
- static {
- System.out.println("load outer class...");
- }
- //静态内部类
- static class StaticInner {
- static {
- System.out.println("load static inner class...");
- }
- static void staticInnerMethod() {
- System.out.println("static inner method...");
- }
- }
- public static void main(String[] args) {
- Outer outer = new Outer(); //此刻其内部类是否也会被加载?
- System.out.println("===========分割线===========");
- Outer.StaticInner.staticInnerMethod(); //调用内部类的静态方法
- }
- }
load outer class... ==========分割线========== load static inner class... static inner method... |
调用构造方法时,外部类Outer被加载,但这时其静态内部类StaticInner却未被加载。直到调用该内部类的静态方法(在分割线以下),StaticInner才被加载。可以做类似的实验验证非静态内部类的情况。
结论:加载一个类时,其内部类不会同时被加载。一个类被加载,当且仅当其某个静态成员(静态域、构造 器、静态方法等)被调用时发生。
三、父类以及子类的加载顺序
1、加载一个子类时,其父类是否同时被加载?下面我们做一个实验来看一下。
class Parent { private static String aa = "父类静态属性"; { System.out.println("父类构造块"); } static{ System.out.println("父类静态块"); } public Parent() { System.out.println("父类构造方法"); } } class Child extends Parent { private static String bb = "子类静态属性"; { System.out.println("子类构造块"); } static{ System.out.println("子类静态块"); } public Child() { System.out.println("子类构造方法"); } } public class Test{ public static void main(String[] args) { new Child(); } } |
2、运行结果
父类静态块 子类静态块 父类构造块 父类构造方法 子类构造块 子类构造方法 |