java 中类的加载顺序
参考: http://www.cnblogs.com/guoyuqiangf8/archive/2012/10/31/2748909.html
1、虚拟机在首次加载Java类时,会对静态初始化块、静态成员变量、静态方法进行一次初始化
2、只有在调用new方法时才会创建类的实例
3、类实例销毁时候,首先销毁子类部分,再销毁父类部分
package com.xiaofan.class_initialization; public class Parent { public static int i = initializationParentStaticField(); // 静态成员变量 int j = initializationParentField(); // 类成员变量 public static int initializationParentStaticField(){ System.out.println("父类静态成员变量"); return -1; } public int initializationParentField() { System.out.println("父类类成员变量"); return -1; } { System.out.println("父类非静态代码块"); } static { System.out.println("父类静态代码块"); } public Parent() { System.out.println("父类的构造方法"); } public static int parentStaticMethod() { System.out.println("父类的静态方法"); return -1; } public int parentMethod(){ System.out.println("父类的非静态方法"); return -1; } @Override protected void finalize() throws Throwable { super.finalize(); System.out.println("销毁父类"); } }
package com.xiaofan.class_initialization; public class Child extends Parent { public static int i = initializationChildStaticField(); // 静态成员变量 int j = initializationChiledField(); // 类成员变量 public static int initializationChildStaticField(){ System.out.println("子类静态成员变量"); return 0; } public int initializationChiledField() { System.out.println("子类类成员变量"); return 0; } { System.out.println("子类非静态代码块"); } static { System.out.println("子类静态代码块"); } public Child() { System.out.println("子类的构造方法"); } public static int childStaticMethod() { System.out.println("子类的静态方法"); return 0; } public int childMethod(){ System.out.println("子类的非静态方法"); return 0; } @Override protected void finalize() throws Throwable { super.finalize(); System.out.println("销毁子类"); } }
package com.xiaofan.class_initialization; public class TestMain { public static void main(String[] args) { Parent.parentStaticMethod(); // Child child = new Child(); // Child.childStaticMethod(); } }
输出:
Parent.parentStaticMethod();
类中static 方法在第一次调用时加载,类中static成员按在类中出现的顺序加载。
父类静态成员变量
父类静态代码块
父类的静态方法
注释掉Parent.parentStaticMethod();
去掉注释Child child = new Child();
父类静态成员变量
父类静态代码块
子类静态成员变量
子类静态代码块
父类类成员变量
父类非静态代码块
父类的构造方法
子类类成员变量
子类非静态代码块
子类的构造方法
注释掉Child child = new Child();
去掉注释Child.childStaticMethod();
父类静态成员变量
父类静态代码块
子类静态成员变量
子类静态代码块
子类的静态方法
总结:
一个类,只调用其static方法,加载顺序:
1.静态成员变量
2.静态代码块: static {}
3.被调用的静态方法
子类继承父类,new子类,加载顺序:
1.父类的静态成员变量
2.父类的静态代码块: static {}
3.子类的静态成员变量
4.子类静态代码块: static {}
5.父类类成员变量
6.父类非静态初始化块 {}
7.父类的构造方法
8.子类类成员变量
9.子类非静态代码块 {}
10.子类的构造方法
调用子类的静态方法,加载顺序:
父类静态成员变量
父类静态代码块
子类静态成员变量
子类静态代码块
子类的静态方法