代码段如下所示:
public class Demo {
public static void main(String[] agrs) {
Son son = new Son();
}
}
class Super {
public Super() {
System.out.print("A\t");
}
{
System.out.print("B\t");
}
static {
System.out.print("C\t");
}
}
class Son extends Super {
public Son() {
System.out.print("D\t");
}
{
System.out.print("E\t");
}
static {
System.out.print("F\t");
}
}
静态的东西是属于类的,非静态的东西是属于实例的。
静态块是在类被调用到内存后开始执行的,它和创建对象或main方法都没有关系。
静态块一般用于初始化类中的静态成员,而非晶态块一般用于初始化类中的非静态成员。
在上述代码段中,还要考虑继承的问题。
首先是父类静态 --> C
然后是子类静态 --> F
非静态块是在创建对象时自动执行的代码,它可以看作是构造函数中执行完父类构造函数后的第一部分。(构造函数第一行有一个默认的super()调用,就是调用父类构造函数)。
这个时候执行父类构造函数:
父类非静态区块 --> B
父类构造函数块 --> A
然后是子类构造函数:
子类非静态区块 --> E
子类构造函数块 --> D
总结一下就是:
C F B A E D
值得注意的是,静态的东西只会执行一次,就是在类加载的时候。
如果我们在上例中修改main函数为:
public static void main(String[] agrs) {
Son son = new Son();
Son son2 = new Son();
}
执行结果是:
C F B A E D B A E D