JAVA构造块和静态代码块

构造块和静态代码块

• 构造块:在类体中直接使用{}括起来的代码块(在方法体外)。 • 每创建一个对象都会执行一次构造块。
• 静态代码块:使用static关键字修饰的构造块。 • 静态代码块随着类加载时执行一次。

执行顺序

• 先执行父类的静态代码块,再执行子类的静态代码块。 • 执行父类的构造块,执行父类的构造方法体。
• 执行子类的构造块,执行子类的构造方法体。

code--展示构造块和静态代码块的结构和运行顺序:

public class BlockTest {

// 当需要在执行构造方法体之前做一些准备工作时,则将准备工作的相关代码写在构造块中即可,比如:对成员变量进行的统一初始化操作
{
System.out.println("构造块!"); // (2)
}

// 静态代码块会随着类的加载而准备就绪,会先于构造块执行
// 当需要在执行代码块之前随着类的加载做一些准备工作时,则编写代码到静态代码块中,比如:加载数据库的驱动包等
static {
System.out.println("#####################静态代码块!"); // (1)
}

// 自定义构造方法
public BlockTest() {
System.out.println("====构造方法体!"); // (3)
}

public static void main(String[] args) {

BlockTest bt = new BlockTest();


BlockTest bt2 = new BlockTest();
}
}

运行结果:

code ----父类和子类静态代码块、构造块、静态方法的调用顺序:

public class SuperTest {

{
System.out.println("SuperTest类中的构造块!"); // (2) c
}

static {
System.out.println("SuperTest类中的静态代码块!"); // (1) a
}

public SuperTest() {
System.out.println("SuperTest类中的构造方法体!"); // (3) d
}

public static void main(String[] args) {

// 使用无参方式构造对象
SuperTest st = new SuperTest();
}
}

public class SubSuperTest extends SuperTest {

{
System.out.println("==========SubSuperTest类中的构造块!"); // (2) e
}

static {
System.out.println("==========SubSuperTest类中的静态代码块!"); // (1) b
}

public SubSuperTest() {
System.out.println("==========SubSuperTest类中的构造方法体!"); // (3) f
}

public static void main(String[] args) {

// 使用无参方式构造子类的对象
SubSuperTest sst = new SubSuperTest();
}
}


原文地址:https://www.cnblogs.com/goldenwangyi/p/15031643.html