前几天看一篇文章关于初始化块的问题,于是回想了之前关于这方面的总结,其实不一样非要记住它们的执行顺序:
只要你从底层去理解即可。
1.首先static初始化块是在构造函数之前执行的,而且只执行一次,即类首次加载时。
大家可以这样想象,初始化是在类加载时候完成的,二构造方法是生成对象的,生成对象肯定是在类加载之后完成的。
所以简明扼要,只有先加载后生成对象嘛,所以肯定是先执行初始化块。
2.初始化块是分为静态和非静态,静态初始化块是只执行一次,无论你new多少次,它只执行一次。
非静态初始化块则不是那样,每次new 都会执行,至于执行顺序毋庸置疑,肯定是先静态后非静态,
不过无论静态还是非静态它们的执行顺序都在构造方法前执行。
重要一点就是在存在父类情况下:在执行完非静态块后立即执行其构造函数然后执行子类的非静态代码块然后执行子类的构造方法
package dem;
public class A extends B {
public A() {
System.out.println("A构造方法");
}
static {
System.out.println("A静态初始化块");
}
{
System.out.println("A初始化块");
}
public static void main(String[] args) {
new A();
System.out.println("--------");
new A();
}
}
class B {
public B() {
System.out.println("B构造方法");
}
static {
System.out.println("B静态初始化块");
}
{
System.out.println("B初始化块");
}
}
执行结果如下:
"B静态初始化块
A静态初始化块
B初始化块
A初始化块
B构造方法
A构造方法
--------
B初始化块
B构造方法
A初始化块
A构造方法
扫描二维码关注公众号,回复:
2318428 查看本文章