代码块:
1 定义:只有方法体的方法称为代码块,也可以称为初始化块,属于类中的成员,类似于方法,讲方法封装在方法体中,使用{}包装起来,可以写分号也可以不写分号,但是建议写分号。代码块可以写修饰符,但是只能写static和不写修饰符。
2 分类:静态代码块和普通代码块(即不写static修饰符)
3 注意:代码块的优先级是优先于构造器的
4 使用细节
1> 使用static修饰的代码块称为静态代码块,它随着类的加载而执行,且只会执行一次。但,如果是普通代码块,它所在的类创建一个对象,该普通代码块就会被调用一次。
【静态代码块的作用:对类进行初始化】【在创建对象时,没有被接受的对象称为匿名对象】
2> 类什么时候被加载
a 创建对象实例时(new)
b 创建子类对象时,父类也是会被加载的
c 使用类的静态成员时(静态属性,静态方法),改类也是会被加载的。
【一个类在创建多个对象时,改类只会被加载一次】
【在java中,一个对象能够被使用之前,必须要完成正确的初始化,所以在实例化一个对象时,java虚拟机会检查相关的类型是否已经加载和初始化,如果没有,jvm会立即进行加载并且调用类构造器完成对类的初始化,在类初始化的过程中和初始化完毕后,根据具体情况才会对类进行实例化。】
3> 普通代码块:在创建对象实例时,会被隐式调用,对象被创建一次,就会被执行一次,若只是使用静态成员【静态代码块和静态属性】,普通代码块并不会被调用。
4> 在创建一个对象时,在一个类中的调用顺序是:
a 调用静态代码块和静态属性初始化(静态代码块和静态属性的优先级是一样的,若多个静态代码块和多个静态属性,则按照他们的定义属性进行调用)
b 调用普通代码块和普通属性(普通代码块和普通属性的优先级是一样的,若多个普通代码块和多个普通属性,则也是按照定义的顺序进行调用)
c 调用构造方法
5> 在创建一个子类对象是(继承关系),他们的静态代码块,静态属性初始化,普通代码块,普通属性初始化,构造方法调用顺序如下:
a 父类的静态代码块和静态属性(静态代码块和静态属性的优先级是一样的,所以如果两者都在,则按照定义的顺序进行调用)
b 子类的静态代码块和静态属性(两者优先级一样,都存在,按照定义的顺序进行调用)
c 父类的普代码块和父类的普通属性(两者优先级一样,按照定义的顺序进行调用执行)
d 父类的构造器
e 子类的普通代码块和普通属性(优先级一样,按照定义的顺序进行调用执行)
f 子类的构造器
6> 静态代码块只能调用静态成员,普通代码块可以调用任意成员。