java代码块

一、代码块的使用

当一个类有多个构造函数,并且构造函数都有相同的语句,可以将这些语句放入一个代码块中,提高代码重用。代码块就相当于另一种构造器的形式。
1、语法:【static】{
语句
};
2、分类:代码块分为静态代码块和普通代码块

二、静态代码块和普通代码块区别
  1. static代码块随着类的加载而执行,而且只会执行一次
  2. 普通代码块则随着对象的创建而执行,每创建一次对象,就执行一次

什么时候类会被加载:(可能不单单以下情况,其他情况还未去了解)

  • 创建对象实例时
  • 创建子类对象时,父类也会被加载
  • 使用静态成员时
三、创建子类时类的调用顺序

1.父类静态变量初始化和静态代码块被调用(优先级一样,看代码顺序):创建一个子类对象,首先加载父类信息,因为静态属性会随类的加载被初始化,静态代码块随类的加载而被调用。
2.子类静态变量初始化和静态代码块被调用(优先级一样,看代码顺序):父类加载完后,就开始加载子类,所以静态属性会被初始化,静态代码块被调用。
3.父类普通变量初始化和普通代码块被调用(优先级一样,看代码顺序):子类加载完后,在堆里分配完空间,就会开始使用构造器初始化,但是构造器里前两句其实隐含了super()调用普通代码块与普通变量初始化,所以开始执行父类的构造函数,同时父类构造函数也隐含了这两句,但是父类的super()可能是object类的构造函数,所以也看不出来调用,所以执行父类普通变量初始化和调用普通代码块。
4.父类构造函数:父类执行构造函数隐含的前两句后,因为还处于构造函数中,所以执行剩余的构造语句。
5.子类普通变量初始化和普通代码块被调用(优先级一样,看代码顺序):子类构造函数隐含的第一句super()被执行后就开始执行第二句,子类普通变量初始化和调用普通代码块。
6.子类构造函数:子类执行构造函数隐含的前两句后,因为还处于构造函数中,所以执行剩余的构造语句。

package com.hb.CodeBlock;
public class codeBlockDetail {
    public static void main(String[] args) {
        new B02();
    }
}
class A02 { //父类
    private static int n1 = getVal01();//静态属性的初始化
    static {
        System.out.println("A02 的一个静态代码块..");
    }
    {
        System.out.println("A02 的第一个普通代码块..");
    }
    public int n2 = getVal02();//普通属性的初始化
    public static int getVal01() {
        System.out.println("静态属性n1被初始化");
        return 10;
    }
    public int getVal02() {
        System.out.println("普通属性n2被初始化");
        return 10;
    }
    public A02() {
        // 隐藏
        //super()
        //普通代码和普通属性的初始化
        System.out.println("A02 的构造器");
    }
}
class B02 extends A02 {
    private static int n3 = getVal03();//静态属性的初始化
    static {
        System.out.println("B02 的一个静态代码块..");
    }
    public int n4 = getVal04();//普通属性的初始化
    {
        System.out.println("B02 的第一个普通代码块..");
    }
    public static int getVal03() {
        System.out.println("静态属性n3被初始化");//(3)
        return 10;
    }
    public int getVal04() {
        System.out.println("普通属性n4被初始化");//(8)
        return 10;
    }
    public B02() {
        // 隐藏
        //super()
        //普通代码和普通属性的初始化
        System.out.println("B02 的构造器");
    }
}

在这里插入图片描述