看到这题不要着急一步一步的分析
1.此代码文件保存为"Z"(有main方法),而Z继承了X,所以首先加载X类,而在X类中有静态代码块,所以输出"X的静态代码块.....1"
2.加载类Z,因为Z中有静态代码块,所以输出"Z的静态代码块......2"
3.执行Z的空参构造函数中super()通知父类进行初始化操作,而在父类(X类)中有引用类型的成员变量、构造代码块(它们俩按照先后顺序执行)、构造方法
a.为X类中引用变量b执行初始化操作,b=new Y();此时要加载类Y
(1)加载类Y执行Y类中的静态代码块,所以输出"Y的静态代码块.....3"
(2)执行Y类中的构造代码块,所以输出"Y的构造代码块.....4"
(3)执行Y类中的空参构造函数,所以输出"Y的空参构造函数....5"
b.执行X类中的构造代码块,所以输出"X的构造代码块.....6"
c.执行X类中的构造函数,所以输出"X的空参构造函数....7"
4.父类初始化完毕(包括成员变量、构造代码块(它俩按照代码中的先后顺序执行)、构造函数)后,并不会直接执行super()后面的内容,而是要对子类Z按照上面的
顺序进行初始化(包括成员变量、构造代码块(它俩按照代码中的先后顺序执行)、构造函数)
a.子类X构造代码块在上面,所以先执行,输出"Z的构造代码块......8"
b.为Z类Z的成员变量w赋值w=new W(),所以要现加载W
(1)加载类W,执行其中的静态代码块,所以输出"W的静态代码块......9"
(2)创建W的对象,所以先执行W的构造代码块,输出"W的构造代码块......10"
(3)执行W的构造方法,所以输出"W的空参构造函数....11"
c.接着执行super()后面的内容,所以输出"Z的空参构造函数....12"
|