详解Java中的实例初始化块(IIB)

 更新时间:2018年10月16日 14:31:42   投稿:laozhang  
在本篇文章里我们针对Java中的实例初始化块(IIB)做想详细分析,有需要的朋友们可以跟着学习参考下。

在 Java 语言中的类初始化块 文章中我们简单的介绍了下 Java 中的实例初始化块 ( IIB )。不过我觉得介绍的有点简单了,于是,再写一篇文章详细介绍下吧。

Java 语言中,存在三种操作:方法 、构造函数 和 初始化块。

其中初始化块又分为 实例初始化块 ( IIB ) 和 静态初始化块。本章节,我们主要介绍实例初始化块。

实例初始化块 用于初始化实例变量。

实例初始化块 会在初始化类的一个实例时执行,而且在构造函数之前就执行。并且每次创建类的对象时它们都会执行。

实例化块的语法

实例初始化块一般放在构造函数之前,使用大括号 {} 扩起来的代码。语法结构一般如下

class JavaTester 
{ 
  // 实例化块 
  { 
    System.out.println("IIB block"); 
  } 
   
  // 构造函数
  JavaTester() 
  { 
    System.out.println("Constructor Called"); 
  } 
  public static void main(String[] args) 
  { 
    JavaTester a = new JavaTester(); 
  } 
}

注意,实例化块并不是类的必须。只是一个可选项。用于抽出构造函数的公共部分单独执行而已。

这段代码是可以编译运行的,运行结果如下

[yufei@www.twle.cn java]$ javac JavaTester.java && java JavaTester
IIB block
Constructor Called

一个类中包含多个实例初始化块

类中的 实例初始化块 并不是类所必须的,而且,不限数量。一个类既可以没有实例初始化块,也可以有多个实例初始化块。

如果一个类有多个实例初始化块,那么它们会按照顺序从上到下依次执行,也就是说,定义在类顶部的实例初始化块最先执行。

我们来看一段代码,下面的类 JavaTester 定义了多个实例初始化块。

class JavaTester 
{ 
  { 
    System.out.println("IIB1 block 1 "); 
  } 
   
  { 
    System.out.println("IIB2 block 2"); 
  } 
    
  JavaTester() 
  { 
    System.out.println("Constructor Called"); 
  } 
    
  { 
    System.out.println("IIB3 block 3"); 
  } 
   
  public static void main(String[] args) 
  { 
    JavaTester a = new JavaTester(); 
  } 
}

运行上面这段代码,输出结果如下

[yufei@www.twle.cn java]$ javac JavaTester.java && java JavaTester
IIB1 block 1 
IIB2 block 2
IIB3 block 3
Constructor Called

父类中的初始化块

在 Java 语言的继承体系中,父类同样可以有初始化块,而且数量不限。

父类的实例初始化块在子类的构造函数中调用 super() 之后立即运行。编译器会在执行当前类的实例初始化块之前先执行父类的实例初始化块。

是不是很绕口,我们写一段代码来演示下

class B 
{ 
  B() 
  { 
    System.out.println("B-Constructor Called"); 
  } 
  
  { 
    System.out.println("B-IIB block"); 
  } 
  
}
 
public class JavaTester extends B 
{ 
  { 
    System.out.println("JavaTester IIB1 block 1 "); 
  } 
   
  { 
    System.out.println("JavaTester IIB2 block 2"); 
  } 
    
  JavaTester() 
  { 
    super(); 
    System.out.println("JavaTester-Constructor Called");
  } 
    
  { 
    System.out.println("JavaTester IIB3 block 3"); 
  } 
   
  public static void main(String[] args) 
  { 
    JavaTester a = new JavaTester(); 
  } 
}

运行以上范例,输出结果如下

[yufei@www.twle.cn java]$ javac JavaTester.java && java JavaTester
B-IIB block
B-Constructor Called
JavaTester IIB1 block 1 
JavaTester IIB2 block 2
JavaTester IIB3 block 3
JavaTester-Constructor Called

从运行的结果来看,当创建类 JavaTester 的对象时,编译器尝试执行类 JavaTester 的构造函数。但因为它有一个父类,在发现了 super() 语句后,就转而先执行父类的构造函数。

因此,在继承体系中,实例初始化块和构造函数的执行顺序如下

执行父类的实例初始化块

执行父类的构造函数

执行当前类的实例初始化块

执行当前类的构造函数

实例初始化块的要点

我们一起来回顾下实例初始化块的要点。

每次创建新实例时都会运行实例初始化块

初始化块按它们在类中出现的顺序运行

如果存在父类,则首先会实例化父类然后在调用当前类的实例初始化块,最后再调用当前类的构造函数。

您可能感兴趣的文章:

相关文章

  • Spring Boot2.0 @ConfigurationProperties使用详解

    Spring Boot2.0 @ConfigurationProperties使用详解

    这篇文章主要介绍了Spring Boot2.0 @ConfigurationProperties使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • Java在高并发场景下实现点赞计数器

    Java在高并发场景下实现点赞计数器

    点赞计数器的本质就是对某个变量在高并发情况下的修改,这篇文章主要为大家介绍了Java实现点赞计数器的示例代码,感兴趣的小伙伴可以了解一下
    2023-06-06
  • Spring中的SpringData详细说明

    Spring中的SpringData详细说明

    这篇文章主要介绍了Spring中的SpringData详细说明,Spring Data 是Spring 的一个子项目, 旨在统一和简化对各类型持久化存储, 而不拘泥于是关系型数据库还是NoSQL 数据存储,需要的朋友可以参考下
    2023-11-11
  • java 反射getClass .class 的使用方法示例

    java 反射getClass .class 的使用方法示例

    这篇文章主要介绍了java 反射getClass .class 的使用方法,结合实例形式分析了java类反射机制的相关操作技巧,需要的朋友可以参考下
    2019-11-11
  • java多线程之火车售票系统模拟实例

    java多线程之火车售票系统模拟实例

    下面小编就为大家带来一篇java多线程之火车售票系统模拟实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • mybatis的映射xml中动态设置orderby方式

    mybatis的映射xml中动态设置orderby方式

    这篇文章主要介绍了mybatis的映射xml中动态设置orderby方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • 详解Lombok快速上手(安装、使用与注解参数)

    详解Lombok快速上手(安装、使用与注解参数)

    这篇文章主要介绍了详解Lombok快速上手(安装、使用与注解参数) ,这里整理了一些日常编码中能遇到的所有关于它的使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • java构造器 默认构造方法及参数化构造方法

    java构造器 默认构造方法及参数化构造方法

    构造器也叫构造方法、构造函数,是一种特殊类型的方法,负责类中成员变量(域)的初始化。构造器的用处是在创建对象时执行初始化,当创建一个对象时,系统会为这个对象的实例进行默认的初始化,下面文章将进入讲解,需要的朋友可以参考下
    2021-10-10
  • Java实现图片上传至服务器功能(FTP协议)

    Java实现图片上传至服务器功能(FTP协议)

    这篇文章主要为大家详细介绍了Java实现图片上传至服务器功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • SpringBoot中的@EnableConfigurationProperties注解原理及用法

    SpringBoot中的@EnableConfigurationProperties注解原理及用法

    在SpringBoot中,@EnableConfigurationProperties注解是一个非常有用的注解,它可以用于启用对特定配置类的支持,在本文中,我们将深入探讨@EnableConfigurationProperties注解,包括它的原理和如何使用,需要的朋友可以参考下
    2023-06-06

最新评论