前言
在Java的一个类中会有很多的东西,初始化块,静态初始化块,方法…
那么在new
一个类的对象的时候这些东西的初始化顺序一定有先后。先执行呢里的在执行哪里的都有说法。接下来我们用一个个小实验来证明初始化块 静态初始化块 类变量 类方法 构造器
的执行顺序
实验
public class MainStart {
public static void main(String[] args) {
B1 a1 = new B1();
}
}
class A1 {
static {
System.out.println("父类静态初始化块");
}
{
System.out.println("父类非静态初始化块");
}
A1() {
System.out.println("父类构造器");
}
}
class B1 extends A1 {
static {
System.out.println("子类静态初始化块");
}
{
System.out.println("子类费静态初始化块");
}
B1() {
System.out.println("子类构造器");
}
}
结果如下我们可以看到先执行在我们创建一个子类对象的时候先执行父类静态初始化块, 然后执行子类静态初始化块, 然后执行父类初始化块, 父类构造器, 子类初始化块, 子类构造器;
小知识
那我们刚才研究了创建一个子类对象是这样调用的,那我们来试一下多态情况下是怎么调用的;
public class MainStart {
public static void main(String[] args) {
B1 b1 = new B1();
A1 a1 = new B1();
}
我们这里只改变main方法里的内容,增加一句利用多态的性质创建对象;
这里的结果如下
这里咋肥四鸭?????
我们可以看到第二句利用多态创建的子类对象不执行静态初始化块了!!!
其实这是因为在同一个程序中,也就是同一个jvm进程中,第一次使用类的时候就已经完成了类的初始化,而静态的内容属于类本身,所以在第二次调用的时候就不会在执行静态初始化块里的内容了,同样的对于静态变量只会初始化一次在一个程序中只会初始化一次;
最后一个问题
静态变量和静态初始化块谁先执行!!
这个我们这里就不做实验了,谁在前面谁先执行!!哪怕你在静态初始化块中调用了静态变量,也是谁在前面谁先执行。如果此时静态变量在后面那么就会报错了!