初始化
输出结果为?
public class Father{
private int i = test();
private static int j = method();
static{
System.out.print("(1)");
}
Father(){
System.out.print("(2)");
}
{
System.out.print("(3)");
}
public int test(){
System.out.print("(4)");
return 1;
}
public static int method(){
System.out.print("(5)");
return 1;
}
}
public class Son extends Father{
private int i = test();
private static int j = method();
static{
System.out.print("(6)");
}
Son(){
System.out.print("(7)");
}
{
System.out.print("(8)");
}
public int test(){
System.out.print("(9)");
return 1;
}
public static int method(){
System.out.print("(10)");
return 1;
}
public static void main(String[] args) {
Son s1 = new Son();
System.out.println();
Son s2 = new Son();
}
}
结果
(5)(1)(10)(6)(9)(3)(2)(9)(8)(7)
(9)(3)(2)(9)(8)(7)
解释
父类的初始化<clinit>
:
- (1)j = method(); (5)
- (2)父类的静态代码块(1)
按从上到下的顺序排列谁在上先执行谁
父类的实例化方法(2.3步也是按从上到下的顺序执行):
- (1)super()(最前)
- (2)i = test(); (4)
- (3)父类的非静态代码块 (3)
- (4)父类的无参构造(最后)(2)
子类的初始化<clinit>
:
- (1)j = method();(10)
- (2)子类的静态代码块(6)
因为Son继承Father,所以先执行父类
先初始化父类:(5) (1)
初始化子类:(10)(6)
子类的实例化方法:
- (1)super()(调用父类方法,重写了test方法,最前) (9)(3)(2)
- (2)i = test(); (9)
- (3)子类的非静态代码块 (8)
- (4)子类的无参构造(最后) (7)
所以
(5) (1)(10)(6)(9)(3)(2)(9)(8)(7)
又因为创建了两个Son对象,因此实例化方法执行两次
(9)(3)(2)(9)(8)(7)