今天学到了代码块相关的知识,感觉内容挺多的。
首先总结一下执行顺序就是:
父静->子静->父普->父构->子普->子构
由以下代码作为示例:
public class Main() {
public static void main() {
B b = new B();
}
}
class A{
public static int num1;
static {
num1 = 100;
System.out.println("执行A的static代码块");
}
{
System.out.println("执行A的普通代码块");
}
public A() {
System.out.println("A的默认构造器");
System.out.println(num1);
}
}
class B extends A {
public static int num2;
static {
num2 = 200;
System.out.println("执行B的static代码块");
}
{
System.out.println("执行B的普通代码块");
}
public B() {
//隐去了super();
System.out.println("B的默认构造器");
System.out.println(num2);
}
}
1、在main方法中,执行B b = new B() 时,会发生类加载。
顺序:先加载父类,再加载子类
即在此过程,先加载父类的静态相关属性和方法,再是子类。
所以会输出:
执行A的static代码块
执行B的static代码块
2、在B的构造器中,有隐式调用的super方法,所以会先执行A类的构造器,但在之前又会调用A的父类,即Object类,但在Object中无任何显示,所以会执行A的普通代码块,在执行A的构造器中的内容,其次才是B的普通代码块,最后是B的构造器中的内容 。
所以会输出:
执行A的普通代码块
A的默认构造器
100
执行B的普通代码块
B的默认构造器
200
最后在终端会输出:
执行A的static代码块执行B的static代码块
执行A的普通代码块
A的默认构造器
100
执行B的普通代码块
B的默认构造器
200
还有许多小细节:
类加载的三种情况:
1.创建对象实例时
2.创建子对象时,父类也会被加载,而且优先加载
3.使用类的静态成员时(静态属性,静态方法)
在同一个类中有多个静态属性和代码块时,调用的优先级时一样的。
如果有多个静态代码块和多个静态属性,则按照他们定义的顺序执行
普通代码块和普通属性同样如此。
最后吐槽一句,写博客每次都习惯性的 ctrl + s ,给我整不会了



