java中的静态代码块、构造代码块、构造函数
- 静态代码块,static修饰的代码块,类加载时执行,只执行一次;格式:
static{代码块}
- 构造代码块,直接在类中用
{代码块}
定义,每一次创建对象时执行 - 在同一个类中执行顺序为:静态代码块>构造代码块>构造函数
- 在有继承关系的两个类中执行顺序为:父类静态代码块>子类静态代码块>父类构造代码块>父类构造函数>子类构造代码块>子类构造函数
例:
//在同一个类中:
class A{
static{
System.out.println("静态代码块");
}
{
System.out.println("构造代码块");
}
public A(){
System.out.println("构造函数");
}
public static void main(String[] args){
A a = new A();
}
}
运行结果:
静态代码块
构造代码块
构造函数
//在存在继承关系的类中
class A{
static{
System.out.println("父类静态代码块");
}
{
System.out.println("父类构造代码块");
}
public A(){
System.out.println("父类构造函数");
}
}
class B extends A{
static{
System.out.println("子类静态代码块");
}
{
System.out.println("子类构造代码块");
}
public A(){
System.out.println("子类构造函数");
}
}
class Test{
public static void main(String[] args){
B b = new B();
}
}
运行结果:
父类静态代码块
子类静态代码块
父类构造代码块
父类构造函数
子类构造代码块
子类构造函数
静态代码块类加载时执行,类加载是先加载父类再加载子类,因此先执行父类静态代码块再执行子类静态代码块
在创建对象时 先创建父类对象再创建子类对象,并且构造代码块优于构造函数先执行因此先输出“父类构造代码块”再输出“父类构造函数”接着创建子类对象先输出“子类构造代码块”再输出“子类构造函数”。
父类优先于子类加载,静态代码块在类加载时执行,构造代码块和构造函数在创建对象时执行且构造代码块优先于构造函数执行