代码块
代码块:又称初始化块,属于类中的成员。与方法类似,将逻辑语句封装于方法体内,但没有方法名,没有返回,没有参数,只有方法体。加载类或创建对象时隐式调用
[修饰符]{
代码
};
静态代码块
static修饰的类,随着类的加载而执行,并且只会执行一次。
以下三种情况类会被加载:
1.创建对象实例
2.创建子类实例父类也会被加载
3.使用类的静态成员
普通代码块
不加static修饰的代码块。 普通的代码块在创建对象实例时,会被隐式调用,但是每创建一次就会被调用一次。如果使用类调用静态成员,则不会被执行
代码块的执行顺序
在类的构造方法中未直接调用super()和普通代码块,但却隐藏的调用了。
class AA {
public AA() {
// 方法中并未直接给出,但却用藏的执行了下面内容
//super() 默默的执行了
//调用普通代码块 默默的执行了
}
}
创建对象时调用顺序
按照先静态再普通最后构造的顺序调用,静态同级之间,静态代码块和静态属性的先后顺序,普通亦然。
public class Demo {
public static void main(String[] args) {
AA aa = new AA();
}
}
class AA {
static {
System.out.println("AA的静态代码快");
}
public AA() {
System.out.println("构造方法");
}
{
System.out.println("AA的普通代码快");
}
}
结果
AA的静态代码快
AA的普通代码快
构造方法
创建子类对象时调用顺序
1.父类的静态代码块和静态属性(优先级一样,按定义顺序执行
2.子类的静态代码块和静态属性(优先级一样,按定义顺序执行)
3.父类的普通代码块和普通属性初刘:(优先级一样,按定义顺序执行
4.父类的构造方法
5.子类的普通代码块和普通属性初始化(优先级一样,按定义顺序执行
6.子类的构造方
public class Demo {
public static void main(String[] args) {
BB bb = new BB();
}
}
class AA {
static {
System.out.println("父类AA的静态代码快");
}
{
System.out.println("父类AA的普通代码快");
}
public AA() {
System.out.println("父类AA的构造方法");
}
}
class BB extends AA {
static {
System.out.println("子类BB的静态代码快");
}
{
System.out.println("子类BB的普通代码快");
}
public BB() {
System.out.println("子类BB的构造方法");
}
}
输出
父类AA的静态代码快
子类BB的静态代码快
父类AA的普通代码快
父类AA的构造方法
子类BB的普通代码快
子类BB的构造方法
注意
静态代码块只能直接调用静态成员(静态属性和静态方法),普通代码块可以调用任意成员