介绍与使用
代码块又称为初始化块,属于类中的成员(类的一部分),类似于没有方法名和返回和参数的方法,只有方法体,通过{}包围起来。
基本语法:
[修饰符]{ 代码 }
- 修饰符可选,只能写static
- 代码块分为两类,使用static修饰的叫静态代码块,没有static修饰的叫普通代码块
- 逻辑语句可以为任何逻辑语句
;
号可以写也可以省略- 代码块相当于另外一种形式的构造器,是对构造器的补充
应用场景:
如果多个构造器中存在重复的语句,可以抽取到代码块中,提高代码复用性;在调用构造器之前,会先自动调用代码块中的内容。
代码块细节
- static代码块也叫静态代码块,作用就是对类进行初始化,而且它随着类的加载而执行,并且只会执行一次,如果是普通代码块,每创建一个对象,就执行
- 类什么时候被加载:
-
- 创建对象实例时(Cat cat = new Cat();)
- 创建子类对象实例,父类也会被加载(如果Cat继承了Animal,那么new Cat也会调用Animal父类的静态代码块)
- 使用类的静态成员时(静态属性,静态方法,都会调用)
- 上述情况总次数只会执行一次
- 普通的代码块,在创建对象实例时,会被隐式的调用,创建一次就会调用一次。如果只是使用类的静态成员,普通代码块不会被调用。
- 创建一个对象时,在一个类中的调用顺序是:
-
- 调用静态代码块和静态属性初始化(注意:静态代码块和静态属性初始化调用的优先级一样,如果存在多个静态代码块和多个静态变量初始化,则他们按照定义的顺序进行)
- 调用普通代码块和普通属性的初始化(注意:普通代码块和普通属性初始化调用的优先级一样,如果存在多个普通代码块和多个普通属性初始化,则按照定义顺序调用)
- 调用构造方法
顺口溜:先静态后普通,同等级看顺序,最后构造器
- 我们在第四点说到的b、c中涉及到的普通代码块和构造器的顺序时说是先调用普通代码块和普通属性的初始化,然后在进行构造方法的调用。那么具体是如何实现的呢?设计到继承时又是怎样的呢?
如下代码:
public class Main {
public static void main(String[] args) {
new Sub();
}
}
class Base {
public Base(){
System.out.println("Base的构造器");
}
}
class Sub extends Base{
{
System.out.println("Sub的普通代码块");
}
public Sub(){
System.out.println("Sub的构造器");
}
}
输出顺序为:
Base的构造器
Sub的普通代码块
Sub的构造器
实际上,在构造器语句之前隐含了两个语句,为
public Sub(){
//super();隐藏操作
//调用普通代码块
System.out.println("Sub的构造器");
}
所以,他会先执行super()的操作,先进行父类的无参构造,然后进行调用本类的普通代码块,然后再调用自己的语句
- 存在多层继承和多个类之间的初始化顺序如下:
- 父类的静态代码块和静态属性初始化(优先级一致看定义顺序)
- 子类的静态代码块和静态属性初始化(优先级一致看定义顺序)
- 父类的普通代码块和普通属性初始化(优先级一致看定义顺序)
- 父类的构造方法
- 子类的普通代码块和普通属性初始化(优先级一致看定义顺序)
- 子类的构造方法
© 版权声明
- 本博客所拥有的文章除特别声明外,均默认采用 CC BY 4.0 许可协议。
- 文章部分内容可能来源于公共网络,如有侵权,请联系博主在核实后进行修改或删除。
THE END
暂无评论内容