先来看一段代码:
public class Father {
int ii;
static int fsi = 4;
{
System.out.println("4 father");
}
static {
System.out.println("5 father");
}
public Father() {
ii = 1;
System.out.println("6 father");
}
static Son son = new Son();
}
public class Son extends Father {
private int i = 1;
private long l = 2L;
static int ssi = 3;
{
System.out.println("1 Son");
}
static {
System.out.println("2 Son");
}
public Son() {
l=3L;
System.out.println("3 Son");
}
}
public class Init {
public static void main(String[] args) {
Son son = new Son();
}
}
答案在文末
以前也是懵里懵懂,答得总是不对,今天看了下面文章才算是真的明白了吧。
https://blog.csdn.net/dingshuo168/article/details/102691891
上面的题是对原文章的题做了一丢丢变化,也就是 Parent 中的 static Son son = new Son(); 调换了位置。
以防上面的文章失效,记录下结论
1.static 变量初始化代码和代码块中的代码,在类初始化这步按照在代码中书写的顺序被执行,非 static 同理。
2.javac编译实现:
- javac 编译器生成一个 <clinit> 方法,把“静态变量的初始化语句”和“static代码块语句”按照代码中的顺序编译到 <clinit> 方法中;
- javac 编译器把“实例变量的初始化语句”和“实例代码块的语句”按照代码中的顺序编译到了构造方法中;
3.原文中的结果:初始化对象的代码比静态的更早执行,我一直无法理解。也就是 static Son son = new Son() 这句代码。后来理解了:说白了,类初始化就是JVM执行代码的过程
也就是那句代码相当于执行原文下图的 1、2。
image.png
执行结果为:
5 father
4 father
6 father
1 Son
3 Son
2 Son
4 father
6 father
1 Son
3 Son
网友评论