*java虚拟机先加载父类,再加载子类。
*在加载类时,会对静态初始化块、静态成员变量(类变量)、静态方法进行一次初始化。
*只有在调用new方法时才会创建类的对象。
*创建对象的过程是:按照父类继承关系进行初始化,首先执行父类的初始化块部分,后是父类的构造方法,再执行子类的初始化块,最后是子类的构造方法。
*销毁对象的过程是:首先销毁子类部分,再销毁父类部分。
看下面代码:
父类:
public class Parent { private int ix = 50;
private static int iz = getNext(30); { System.out.println("Parent的初始化块"); int x = 100; int y = getNext(100); } static { System.out.println("Parent的静态初始化块"); int sx = 100; int sy = getNext(100); } public Parent() { System.out.println("Parent的构造方法被调用"); } public void display() { System.out.println("Parent的display方法被调用"); System.out.print("ix=" + this.ix); System.out.println("; iz=" + iz); dispA(); } public static void dispA() { System.out.println("Parent的dispA()被调用"); } public static int getNext(int base) { System.out.println("Parent的getNext(int base)被调用"); return ++base; } protected void finalize() { System.out.println("Parent的销毁方法被调用"); } }
子类:
public class Child extends Parent { { System.out.println("Child的初始化块"); int bx = 100; } static { System.out.println("Child的静态初始化块"); } public Child() { super(); System.out.println("Child的构造方法被调用"); } public static void dispB(){ System.out.println("Child的dispB()被调用"); } protected void finalize() { System.out.println("Child的销毁方法被调用"); super.finalize(); } }
测试类:
package book.oo.initorder;
public class ClassInitOrderTest {
public static void main(String[] args) { System.out.println("不new对象,访问静态方法时的输出:"); Child.dispB(); System.out.println(); System.out.println("new对象,访问非静态方法时的输出:"); new Child().display(); //通知虚拟机进行垃圾回收 System.gc(); }
}
程序输出://保留main方法的前2行程序,将后面的注释,得到的输出结果是如下: // 不new对象,访问静态方法时的输出: // Parent的静态初始化块 // Parent的getNext(int base)被调用 // Parent的getNext(int base)被调用 // Child的静态初始化块 // Child的dispB()被调用 //将main方法的前3行程序注释,保留后面的程序,得到的输出结果如下: // new对象,访问非静态方法时的输出: // Parent的静态初始化块 // Parent的getNext(int base)被调用 // Parent的getNext(int base)被调用 // Child的静态初始化块 // Parent的初始化块 // Parent的getNext(int base)被调用 // Parent的构造方法被调用 // Child的初始化块 // Child的构造方法被调用 // Parent的display方法被调用 // ix=50; iz=31 // Parent的dispA()被调用 // Child的销毁方法被调用 // Parent的销毁方法被调用