java中的构造块代码和构造函数

代码块

构造代码块中的代码也是在构造方法中执行的。在编译时的编译器看来会默认将构造代码块中的代码移动到构造方法中,并且移动到构造方法内容的前面。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class TestCode {
public TestCode() {
System.out.println("构造方法");
}
{
System.out.println("代码块");
}
public static void main(String[] args) {
new TestCode();
}
}

相当于

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class TestCode {
public TestCode() {
System.out.println("代码块");
System.out.println("构造方法");
}
public static void main(String[] args) {
new TestCode();
}
}
//构造块
//构造方法

校招题

那么去理解网易的那个题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class 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();
}
}

思路

  1. 首先去new一个Z,但是Z继承了X,所以先要去执行X的构造函数
  2. 发现X中有构造代码块和构造函数,所以先要去执行构造代码块,也就是new Y()
  3. 打印一个Y
  4. 然后继续执行X的构造函数,打印一个X
  5. 执行完Z的父类的new后,开始执行Z自己本身的new过程
  6. 发现Z中也有构造代码块,所以要先去执行构造代码块new Y(),再次打印一个Y
  7. 然后执行Z的构造函数,打印一个Z
  8. 最后的结果是YXYZ

静态代码块

  1. 父类的静态成员赋值和静态块 (静态块和静态成员的顺序为,谁在前面谁先执行(在不出错的情况下)
  2. 子类的静态成员和静态块
  3. 父类的构造方法
  4. 父类的成员赋值和初始化块
  5. 父类的构造方法中的其它语句
  6. 子类的成员赋值和初始化块
  7. 子类的构造方法中的其它语句