代码

};

注意

  1. 修饰符可选,要写的话,也只能写static
  2. 代码块分为两类,使用static修饰的叫静态代码块,没有static修饰的,叫普通代码块
  3. 逻辑语句可以为任何逻辑语句(输入、输出、方法调用、循环、判断等)
  4. ;可以写上,也可以省略

代码块的细节

  1. static代码块也叫静态代码块,作用就是对类进行初始化,而且它随着类的加载而自信,并且只会执行一次,如果是普通代码块,没创建一个对象,就执行。

  2. 类什么时候被加载

    1. 创建对象实例时(new)
    2. 创建子类对象实例,父类也会被加载,而且父类先被加载,子类后被加载
    3. 使用类的静态成员时(静态属性,静态方法)
  3. 普通代码块,在new对象时,被调用,而且是每创建一个对象,就调用一次

    如果只是使用类的静态成员时,普通代码块并不会执行

  4. 创建一个对象时,在一个类 调用顺序是:(重点、难点)

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/ab8174c6-770c-487b-a353-b47bcf58e5ea/.png

  1. 构造器的最前面其实隐含了super()和调用普通代码块,静态相关的代码块,属性初始化,在类加载时,就执行完毕,因此是优先于构造器和普通代码块
class a{
    public a(){//构造器
        //这里有隐藏的执行要求
        //(1). super();//会默认调用父类无参构造器的方法
        //(2). 调用普通代码块
        System.out.println("ok");
    }

}
  1. 我们看一下创建一个子类时(继承关系),他们的静态代码块,静态属性初始化,普通代码块,普通属性初始化,构造方法的调用顺序顺序如下(创建一个对象,分为类的加载和创建对象。类的加载时候就把静态部分按顺序执行了,从父到子。接着是创建对象的构造器看第5点)
  1. 静态代码块只能直接调用静态成员(静态属性和静态方法),普通代码块可以调用任意成员