Java有继承的情况下 代码块执行优先级的问题
本人学习过程中的总结,真正的大佬不用看。
代码块一般分为三种
- static修饰的代码块 (又称为静态代码块,位置在类体中方法外,在加载类的时候优先在静态区分配空间)
- 构造代码块(位置也是在类体方法外,在new一个对象的时候 就会执行该代码块)
- 局部代码块(位置一般为方法体之内,这种局部代码快一般执行完之后内容就会被释放掉)
用代码来解释一下优先级的问题
先创建一个父类
public class Father {
static {
System.out.println("父类的1号静态代码块执行了");
}
static {
System.out.println("父类的2号静态代码块执行了");
}
{
System.out.println("父类的1号构造代码块执行了");
}
{
System.out.println("父类的2号构造代码块执行了");
}
public void out() {
{ System.out.println("父类方法中的局部代码快执行了"); }
}
}
在创建一个子类继承父类
public class Son extends Father {
static {
System.out.println("子类类的静态代码块执行了");
}
{
System.out.println("子类的构造代码块执行了");
}
public void out() {
{ System.out.println("子类方法中的局部代码快执行了"); }
}
}
在main方法里new一个子类对象并且调用执行子类的out方法
public static void main(String[] args) {
Son a =new Son();
a.out();
}
结果为:
从结果看,如果先不考虑子父关系的情况下代码块的优先执行的级别是:
静态代码块>构造代码块>局部代码块
静态代码块优先级最高的的原因是因为他是被static修饰的代码块,当类被加载的时候会优先给static修饰的内容分配存储空间,也是第一时间执行的代码块。之后就是按照从上到下的语序一步一步执行。
构造代码块为什么会比方法体内的局部代码快优先执行呢?因为构造代码块会随着对象被创建(也就是被new出来)而执行,所以只要去创建一个类的对象,就会先执行一遍类体内的构造代码块。
局部代码块就会随着方法的调用而执行了
在明白上面的基础之上,我们在讨论加上子父关系上的理解
在new 子类对象的时候程序会执行一次子类默认的无参构造方法。
而在执行子类的构造方法的时候,一般情况下会在子类构造方法的第一行默认执行一次父类的构造方法,如果没有声明,程序会默认执行一次。
所以不难看出,为什么上面的程序运行结果会在子类的构造代码块执行之前会先执行两次父类的构造代码块了。
同一个类里,同级别的代码块会按照从上到下的语序一步一步的执行。
可以从上面的运行结果看出来
在了解三个代码块的运行优先级之后,其他的语句都是按照从上到下的语序执行的,只不过是通过封装的技术吧一部分代码折叠了起来,造成了这种视觉逻辑上的差异。