分类
- 普通代码块
- 静态代码块
- 同步代码块
使用 synchronized 关键字修饰,并使用“{}”括起来的代码片段 - 构造代码块
构造代码块和构造函数一样同样是在生成一个对象时被调用,
静态代码块、构造代码块、构造函数执行顺序
- 静态代码块,它是随着类的加载而被执行,只要类被加载了就会执行,而且只会加载一次,主要用于给类进行初始化。
- 构造代码块,每创建一个对象时就会执行一次,且优先于构造函数,主要用于初始化不同对象共性的初始化内容和初始化实例环境。
- 构造函数,每创建一个对象时就会执行一次。同时构造函数是给特定对象进行初始化,而构造代码是给所有对象进行初始化,作用区域不同。
一个面试题:
public class HelloA {
//无参数构造方法
public HelloA() {
System.out.println("HelloA");
}
//构造代码块
{
System.out.println("i'm A class");
}
//静态代码块
static{
System.out.println("static A");
}
}
public class HelloB extends HelloA{
public HelloB() {
System.out.println("HelloB");
}
{
System.out.println("i'm B class");
}
static{
System.out.println("static B");
}
public static void main(String[] args) {
new HelloB();
}
}
说明:
在继承关系中,子类的所有构造函数(包括无参构造函数(默认构造函数),有参构造函数等),如果不显式声明调用哪种
super,那么都会默认调用super(),即都会默认调用父类的无参构造函数(默认构造函数)。如果父类此时没有无参构造
函数存在的话,就会报错(编译不过)。为了修改报错,只能显式调用父类显式声明的构造函数之一或者在父类中增加无参构造函数。