文章目录

  • 【Java语言基础】初始化块
  • 使用初始化块
  • 静态初始化块
  • 总结代码


【Java语言基础】初始化块

初始化块又称为代码块。属于类中的第四大成员。本质上是一个方法,它也有方法体,但没有方法名,没有参数,没有返回,而且也不是通过对象或类名显式调用,而是通过隐式调用。

使用初始化块

初始化块是Java类里面可以出现的第四种成员。

优点:

  1. 和构造器很像,都是用于初始化信息
  2. 当多个构造器中有重复的语句,可以将这些重复的语句往上提取到初始化块中,提高代码的重用性

语法格式:

class 类名1{
	[修饰符]{
		//初始化块的可执行代码
	}
}

注意:修饰符只能是static
一个类种可以有多个初始化块,相同类型的初始化块之间有顺序,前面定义的初始化块先执行,后面定义的初始化块后执行。

package JavaNotes;

public class _422blog {
    {
        System.out.println("父类的初始化块!");
    }
    public static void main(String[] args){
        new _422_blog();
        new _422_blog();
    }
}
class _422_blog{
    {
        System.out.println("子类的初始化块!");
    }
}

输出结果:

子类的初始化块!
子类的初始化块!

分析:

  • 当创建Java对象时,系统总是先调用该类里定义的初始化块
  • 如果一个类里定义了两个普通初始化块,则前面定义的初始化块先执行,后面的初始化块后执行
  • 初始化块虽然也是Java类里的一种成员,但是它没有名字,也就没有标识,因此无法通过类,对象来调用初始化块;
  • 初始化块只能在创建对象时自动执行而且在执行构造方法之前执行

注意:
初始化块和声明实例数学时所指定的初始值都是该实例的初始化代码,它们的执行顺序与源程序中那个排列顺序相同。
初始化块和构造方法的不同:
初始化块是一段固定的执行代码,它不能接收任何参数。因此初始化块对同一个类内的属性所进行的初始化处理完全相同。
用法:
如果多个构造方法里有相同的初始化代码,这些代码无需接收参数,那就可以把他们放在初始化块种定义。更好的提高初始化块的复用,提高整个应用的可维护性。

创建一个Java对象时,不仅会执行该类的初始化块和构造方法,系统会先执行其父类的初始化块和构造方法。

静态初始化块

如果定义初始化时使用了static修饰符,则这个初始化块就变成了静态初始化块,也被称为类初始化块。

  • 静态初始化块是类相关的,系统将在类初始化阶段执行静态初始化块,而不是在创建对象时才执行,因此静态初始化块总是比普通初始化块先执行
  • 静态初始块属于类的静态成员,用于对类属性执行初始化处理,不能对实例属性进行初始化处理
  • 系统在类初始化阶段执行静态初始化,不仅会执行本类的静态初始化块,还会一直上溯导Object类(如果它包含静态初始化块)。经过这个过程,才完成了对类的初始化过程。

静态初始化代码:

package JavaNotes;

public class _422blog {
    static {
        System.out.println("父类的静态初始化块!");
    }
    public static void main(String[] args){
        new _422_blog();
        new _422_blog();
    }
}
class _422_blog{
    static {
        System.out.println("子类的静态初始化块!");
    }
}

输出结果:

父类的静态初始化块!
子类的静态初始化块!

总结代码

以下代码为更好的理解初始化块

package JavaNotes;
class Root{
    static {
        System.out.println("Root的静态的初始化块");
    }
    {
        System.out.println("Root的普通初始化块");
    }
    public Root(){
        System.out.println("Root的无参数构造方法");
    }
}
class Mid extends Root{
    static {
        System.out.println("Mid的静态的初始化块");
    }
    {
        System.out.println("Mid的普通初始化块");
    }
    public Mid(){
        System.out.println("Mid的无参数构造方法");
    }
    public Mid(String msg){
        //通过this调用同一类中重载的构造方法
        this();
        System.out.println("Mid的带参数的构造方法,其值是:" + msg);
    }
}
class Leaf extends Mid{
    static {
        System.out.println("Leaf的静态的初始化块");
    }
    {
        System.out.println("Leaf的普通初始化块");
    }
    public Leaf(){
        //通过super调用父类中有一个字符串参数的构造方法
        super("董梦宇");
        System.out.println("执行Leaf的构造方法");
    }
}
public class _422Test {
    public static void main(String[] agrs){
        new Leaf();
        new Leaf();
    }
}