Java静态代码块和构造方法执行顺序

来源:互联网 发布:java 移动文件 编辑:程序博客网 时间:2024/04/27 22:44
package com.uno.staticBlock;import java.lang.reflect.Field;import java.util.Vector;/** * 验证静态代码块和构造代码块执行顺序 *  * 1.加载父类静态代码块 * 2.加载子类静态代码块 * 3.加载父类构造代码块 * 4.父类构造方法 * 5.子类构造代码块 * 6.子类构造方法 * @author uno * */public class StaticBlock {//1.加载MyClass时,不一定会执行static代码块static ClassLoader loader = Thread.currentThread().getContextClassLoader();public static void main(String[] args) {printClassesOfClassLoader(loader);//testClassLoader();new SON();printClassesOfClassLoader(loader);}/** * 测试静态代码块是否执行 *  * 2017年11月20日 * author: leipan */public static void testClassLoader(){//System.out.println("此方法加载class后不会执行static代码块," + MyClass.class + ",但会加载到ClassLoader中。");} public static void printClassesOfClassLoader(ClassLoader loader){          try {              Field classesF = ClassLoader.class.getDeclaredField("classes");              classesF.setAccessible(true);              Vector<Class<?>> classes = (Vector<Class<?>>) classesF.get(loader);              for(Class c : classes) {                  System.out.println(c);              }          } catch (NoSuchFieldException e) {              e.printStackTrace();          } catch (IllegalAccessException e) {              e.printStackTrace();          }      }  }class Father {static {System.out.println("Father static exec。");}{System.out.println("Father unstatic exec。");}public Father (){System.out.println("Father Construction。");}}class SON extends Father{static {System.out.println("myClass static exec。");}{System.out.println("myClass unstatic exec。");}public SON (){System.out.println("Son construction。");}}


结果:

class com.uno.staticBlock.StaticBlockFather static exec。myClass static exec。Father unstatic exec。Father Construction。myClass unstatic exec。Son construction。class com.uno.staticBlock.StaticBlockclass com.uno.staticBlock.Fatherclass com.uno.staticBlock.SON


阅读全文
0 0