1.源码
class Fu { int num=9; static int b=3; static final int a=6; static{ System.out.println("fu...静态代码块执行...a="+a+",b="+b); } { System.out.println("fu"+"...num="+num+",a="+a+",b="+b); } Fu(){ super();//object System.out.println("fu constructor run...num="+num+",a="+a+",b="+b); //显示初始化 //构造代码块初始化 show(); } void show() { System.out.println("呵呵");//被覆盖,运行子类的show方法 } } class Zi extends Fu{ int num=8; static int b=2; static final int a=5; static{ System.out.println("zi...静态代码块执行...a="+a+",b="+b); } { System.out.println("zi"+"...num="+num+",a="+a+",b="+b); } Zi() { super(); //先显示初始化 //再构造代码块初始化 show(); } void show() { System.out.println("show ...num="+num+",a="+a+",b="+b); } } public class Test { public static void main(String[] args) { new Zi(); } }
2.运行结果
fu...静态代码块执行...a=6,b=3 zi...静态代码块执行...a=5,b=2 fu...num=9,a=6,b=3 fu constructor run...num=9,a=6,b=3 show ...num=0,a=5,b=2 zi...num=8,a=5,b=2 show ...num=8,a=5,b=2
3.执行步骤
-
将用到的类加载到内存的方法区, 并将static关键字修饰的成员变量显示初始化,同时执行静态代码块(注意,是先执行父类构造代码块,再执行子类构造代码块)
-
给成员变量赋默认值(此时两个num都为0)
-
在test类中执行 new Zi();
-
执行子类的无参构造函数
-
执行子类无参构造函数中的super();
-
执行父类中的无参构造函数;
-
执行父类无参构造函数中的super();
-
父类中的num显示初始化 num=9;
-
执行父类的构造代码块 (控制台输出 fu )
-
执行父类中的 System.out.println("fu constructor run..."+num); 输出' fu constructor run...9 '
-
执行show();方法, 由于子父类中都存在show方法,所以调用子类的show方法. 由于子类中的num还未显示初始化,所以控制台输出"show ...0"
-
此时,子类无参构造方法中的super()方法执行完成, 子类的成员变量开始显示初始化,既int num=8;
-
子类构造代码块执行,控制台输出 "zi"
-
子类构造方法执行show()方法,此时控制台输出"show ...8"
以上即为 new Zi();的执行过程.