关于静态初始化器(static{})

静态初始化器,作用是用来初始化类的非静态字段(也就是属于对象的非静态字段)

  • 构造函数在对象创建时被自动调用,并在对象变得可用之前完成其中定义的初始化。
  • 也可以使用同一个构造函数来初始化类的静态字段,在构造函数中初始化静态字段就意味着必须等待对象创建完成。
  • 静态初始化器和典型的构造函数的区别在于:构造函数可能包含参数,而静态初始化器不能包含参数。
  • 没有返回类型。
  • 静态初始化器只能访问类的静态成员,不能访问类的非静态成员,因为在静态初始化器执行时没有类的实例可用。

静态初始化器的优点:【形式:(static{})】

  • Modem类可以在静态初始化器中执行寄存器的初始化。
  • 设备驱动可用在静态初始化器中注册需要的原生驱动。
  • 有时候可能需要检查是否有人加载了能访问敏感信息的类,静态初始化器可以用来记录这样的活动。
  • 对于典型的数据库应用程序,可用在静态初始化器中产生预编译的SQL语句。
  • 在单例模式(singleton)中,可用声明私有的静态成员,他们可以在静态初始化器中只初始化一次(单例模式是一种设计模式,通过类的实例化限定到对象,实现了数学上的单例概念)。
  • 相比静态初始化器,初始化方法给了我们更大的灵活性。

静态初始化器的注意事项:

  1. JVM将静态初始化器的大小限制为64KB。因此不能再静态初始化器中放太多的代码。
  2. 不能再静态初始化器中抛出被检查的异常。(编译异常)
  3. 不能再静态初始化器中使用this关键字,因为目前还没有创建实例
  4. 不能在静态初始化器中显示地调用super。(当类被加载时加载静态初始化器,只用当对象创建发生时才调用super,因此super内建于非静态初始化器(构造函数)中,这就是为什么静态初始化器中包含super会导致产生编译时错误。)
  5. 静态初始化器没有返回类型。
  6. 测试静态初始化器中的代码通常成为开发者的噩梦。
  7. 静态初始化器中的代码段不能使用try–catch语句来捕获和处理异常,因此,其一选择是记录异常,然后抛出RuntimeException异常来终止当前线程;另一种选择是调用System.exit()方法。