Java - 26 代码块
[修饰符 static]{
代码
};
类似于方法,没有方法名,没有返回,没有参数
不用通过对象或类 显式调用,而是在加载类 或 创建对象时 隐式调用
普通代码块
好处
构造器的补充机制(减少代码重复冗余),可以做初始化操作
/* 不管调用哪个构造器创建对象,都会先调用代码块的内容 */
class Movie{
private String name;
private String director;
{
System.out.println("电影开始了");
}
public Movie(String name){
this.name = name;
}
public Movie(String name, String director){
this.name = name;
this.director = director;
}
}
细节
- 静态代码块 随着类的加载而执行,只会执行一次
普通代码块 每创建一个对象 (new, 和类加载无关) 就执行一次
类什么时候被加载
-
创建对象实例 (new)
-
创建子类对象实例,父类也会被加载
-
使用类的静态成员
- 创建一个对象,在一个类的调用优先级
① 静态代码和静态属性初始化(如果多个,按定义的顺序调用)
A a = new A(); // (1)"getN1 被调用"; (2)"A 静态代码块01"
class A{
private static int n1 = getN1();
static{
System.out.println("A 静态代码块01");
}
public static int getN1(){
System.out.println("getN1 被调用");
return 100;
}
}
② 普通代码块和普通属性初始化(如果多个,按定义的顺序调用)
③ 构造器
-
构造器 最前面隐含了 super() 和 调用普通代码块
-
创建子类对象时,调用顺序
① 父类的静态代码块和静态属性
② 子类的静态代码块和静态属性
③ 父类的普通代码块和普通属性初始化
④ 父类的构造方法
⑤ 子类的普通代码块和普通属性初始化
⑥ 子类的构造方法
- 静态代码块只能调用静态成员,普通代码块可以调用任意成员