2,java类加载的先后顺序
父类的静态方法2
父类静态初始化块
子类静态初始化块
父类非静态初始化块
父类的构造方法
子类非静态初始化块
子类的构造方法
Parent类:
package ClassLoadOrder; /* * 1,虚拟机在首次加载Java类时,会对静态初始化块、静态成员变量、静态方法进行一次初始化; * (类中static成员按在类中出现的顺序加载) * * 2,只有在调用new方法时才会创建类的实例; * * 3,类实例创建过程:按照父子继承关系进行初始化, * 首先执行父类的静态初始化块、静态成员变量、静态方法块部分; * 在执行子类的静态初始化、静态成员变量、静态方法块部分; * 然后是父类的非静态初始化块(一对大括弧中),接着是父类的构造方法; * 最后执行本类继承的子类的非静态初始化块,接着是子类的构造方法; */ public class Parent { public Parent() { System.out.println("父类的构造方法"); } { System.out.println("父类非静态初始化块"); } static { System.out.println("父类静态初始化块"); } public static int t = parentStaticMethod2(); public static int parentStaticMethod() { System.out.println("父类类的静态方法"); return 10; } public static int parentStaticMethod2() { System.out.println("父类的静态方法2"); return 9; } @Override protected void finalize() throws Throwable { // TODO Auto-generated method stub super.finalize(); System.out.println("销毁父类"); } }
package ClassLoadOrder; public class Child extends Parent { { System.out.println("子类非静态初始化块"); } static { System.out.println("子类静态初始化块"); } public Child() { System.out.println("子类的构造方法"); } public static int childStaticMethod() { System.out.println("子类的静态方法"); return 1000; } @Override protected void finalize() throws Throwable { // TODO Auto-generated method stub super.finalize(); System.out.println("销毁子类"); } }
package ClassLoadOrder; public class Test { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub /*Parent.parentStaticMethod(); System.out.println(); Parent.parentStaticMethod2(); System.out.println(); Parent.parentStaticMethod();*/ Child child = new Child(); //child.childStaticMethod(); //Parent parent = new Parent(); } }
父类静态初始化块 父类的静态方法2 子类静态初始化块 父类非静态初始化块 父类的构造方法 子类非静态初始化块 子类的构造方法
1,虚拟机在首次加载Java类时,会对静态初始化块、静态成员变量、静态方法进行一次初始化;
(类中static成员按在类中出现的顺序加载)
2,只有在调用new方法时才会创建类的实例;
3,类实例创建过程:按照父子继承关系进行初始化,
首先执行父类的静态初始化块、静态成员变量、静态方法块部分(静态成员执行按照代码的先后顺序执行);
在执行子类的静态初始化、静态成员变量、静态方法块部分(静态成员执行按照代码的先后顺序执行);
然后是父类的非静态初始化块(一对大括弧中),接着是父类的构造方法;
最后执行本类继承的子类的非静态初始化块,接着是子类的构造方法;