代码块
构造代码块中的代码也是在构造方法中执行的。在编译时的编译器看来会默认将构造代码块中的代码移动到构造方法中,并且移动到构造方法内容的前面。
|
|
相当于1234567891011121314public class TestCode { public TestCode() { System.out.println("代码块"); System.out.println("构造方法"); } public static void main(String[] args) { new TestCode(); }}//构造块//构造方法
校招题
那么去理解网易的那个题:1234567891011121314151617181920212223242526class X{ Y y = new Y(); public X(){ System.out.println("X"); }}class Y{ public Y(){ System.out.println("Y"); }}public class Z extends X{ Y y = new Y(); public Z(){ System.out.println("Z"); } public static void main(String[] args) { new Z(); }}
思路
- 首先去new一个Z,但是Z继承了X,所以先要去执行X的构造函数
- 发现X中有构造代码块和构造函数,所以先要去执行构造代码块,也就是
new Y()
- 打印一个Y
- 然后继续执行X的构造函数,打印一个X
- 执行完Z的父类的new后,开始执行Z自己本身的new过程
- 发现Z中也有构造代码块,所以要先去执行构造代码块
new Y()
,再次打印一个Y - 然后执行Z的构造函数,打印一个Z
- 最后的结果是
YXYZ
静态代码块
- 父类的静态成员赋值和静态块 (静态块和静态成员的顺序为,谁在前面谁先执行(在不出错的情况下)
- 子类的静态成员和静态块
- 父类的构造方法
- 父类的成员赋值和初始化块
- 父类的构造方法中的其它语句
- 子类的成员赋值和初始化块
- 子类的构造方法中的其它语句