再load子类。
1、java虚拟机执行程序,首先须要装载类,安装现装载父类,初始化父类的静态代码块和静态成员变量
初始化子类静态代码块和成员变量 2、load完成父类与子类后,从main函数入口运行程序。先输出,接着new实例化Beetle类,则先实例化父类Insect,实例化父类时。先初始化非静态成员变量和非静态代码块,接着运行父类构造方法 再实例化子类,实例化子类时,先初始化非静态成员变量和非静态代码块,接着运行子类构造方法。
package it.xiangnan.test; public class Beetle extends Insect { private int k = printInit("Beetle.k initialized"); public Beetle() { System.out.println("k=" + k); System.out.println("j=" + j); } private static int x2 = printInit("static Beetle.x2 initialized"); public static void main(String[] args) { System.out.println("Beetle constructor"); Beetle b = new Beetle(); } } class Insect { private int i = 9; protected int j; Insect() { System.out.println("i=" + i + ",j=" + j); j = 39; } private static int x1 = printInit("static Insect.x1 intialized"); static int printInit(String s) { System.out.println(s); return 47; } } 函数从main处运行 Beetle有父类Insect。先初始化父类的静态成员变量x1,再初始化Beelte类静态成员变量x2 转而从main处运行。输出Beetle constructor,因为紧接着实例化Bettle类。该类有父类Insect,则先运行父类构造函数。在运行子类构造函数 static Insect.x1 initialized 1、父类Insect静态成员变量初始化值为47 static Beetle.x2 initialized 2、Beetle类的静态成员变量x2初始化值为47 Beetle constructor 3、输出 i=9,j=0 4、运行Beetle的父类Insect的默认构造函数 Beetle.k initialized 5、运行Beetle类的默认构造函数,输出k值之前,调用printInit方法输出该句话。并初始化k值为47 k=47 6、分别输出k、j的值 j=39
来源: http://www.bubuko.com/infodetail-2041324.html