这里主要介绍静态代码块(static initialization block)、非静态代码块(initialization block)和构造函数(constrouctor)。
当他们在同一个类中同时出现时(不包含继承的情况),初始化的顺序为:
举个例子:
public class A {
private String name;
{
System.out.println("A的非静态代码块");
}
static {
System.out.println("A的静态代码块");
}
A(){
System.out.println("A的构造函数");
}
A(String name){
this.name = name;
System.out.println("A的有参构造函数,name ="+this.name);
}
public static void main(String[] args) {
new A();
new A("lili");
}
}
结果为:
A的静态代码块
A的非静态代码块
A的构造函数
A的非静态代码块
A的有参构造函数,name =lili
并且上面我故意将非静态代码块放到静态代码块之前,但是依然不能改变静态代码块先执行的结果。其中静态代码块在程序运行时只执行一次。
当出现继承情况时
public class B extends A{
{
System.out.println("B的非静态代码块");
}
static {
System.out.println("B的静态代码块");
}
B(){
System.out.println("B的构造函数");
}
public static void main(String[] args) {
new B();
}
}
这里B继承的是上面的A,其结果为:
A的静态代码块
B的静态代码块
A的非静态代码块
A的构造函数
B的非静态代码块
B的构造函数
- 可以看出静态代码块是第一个执行的,当父类也含有静态代码块时,先执行父类的静态代码块。
- 除去静态代码块,构造函数和非静态代码块都是递归调用执行。
网友评论