在 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() 语句后,就转而先执行父类的构造函数。

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

  1. 执行父类的实例初始化块
  2. 执行父类的构造函数
  3. 执行当前类的实例初始化块
  4. 执行当前类的构造函数

实例初始化块的要点

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

  • 每次创建新实例时都会运行实例初始化块
  • 初始化块按它们在类中出现的顺序运行
  • 如果存在父类,则首先会实例化父类然后在调用当前类的实例初始化块,最后再调用当前类的构造函数。

声明:本文首发 简单教程,网址为 https://www.twle.cn/t/454#reply0

Java 语言中的实例初始化块 ( IIB) 详解相关推荐

  1. [转载] Java 语言中的实例初始化块 ( IIB) 详解

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

  2. java里的初始化块_[转载] Java 语言中的实例初始化块 ( IIB) 详解

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

  3. java 初始化块_详解Java中的实例初始化块(IIB)

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

  4. Java 11中的新功能和API详解系列1

    Java 11中的新功能和API详解系列1 2018.9.27 版权声明:本文为博主chszs的原创文章,未经博主允许不得转载. JDK 11在语言语法方面有一个小改动,增加了相当数量的新API,以及 ...

  5. Java: static,final,代码块 的详解

    Java: static,final,代码块 的详解 每博一文案 山本文绪说过这样一句话:哪些决定放弃了的事,就请放弃得干干净净.哪些决定再也不见面的人,就真 的不要再见面了,不要再做背叛自己的事,如 ...

  6. go语言字符串换行_Go语言中的字符串处理方法示例详解

    1 概述 字符串,string,一串固定长度的字符连接起来的字符集合.Go语言的字符串是使用UTF-8编码的.UTF-8是Unicode的实现方式之一. Go语言原生支持字符串.使用双引号(" ...

  7. C语言中-条件编译#ifdef的妙用详解_透彻

    本文主要介绍c语言中条件编译相关的预编译指令,包括  #define.#undef.#ifdef.#ifndef.#if.#elif.#else.#endif.defined. #define     ...

  8. c语言中数组的概念及作用,详解C语言中的指针与数组的定义与使用

    指针的特点 他就是内存中的一个地址 指针本身运算 指针所指向的内容是可以操作的 操作系统是如何管理内存的 栈空间 4M~8m的大小 当进入函数的时候会进行压栈数据 堆空间 4g的大小 1g是操作系统 ...

  9. c语言中 伪指令,汇编语言六大基础伪指令详解

    六大伪指令(基础) 1.OFFSET 变量是数据的存放地,对变量最常见的操作是从变量中取出数据和把数据放人变量中. 实现这些操作有直接法和间接法两种方法. 以该寄存器加方括号的形式指明是用寄存器中的内 ...

最新文章

  1. linux LD_LIBRARY_PATH环境变量
  2. 合并重定向 command file 21 解析
  3. node.js知识点总结
  4. 最短路径生成树计数+最短路径生成树
  5. element vue 上传模板_vue+element 文件上传
  6. 计算机硬件在线修复,计算机硬件维修
  7. python实验二报告_20172304 2019-2020-2 《Python程序设计》实验二报告
  8. 漫步数理统计十八——相关系数
  9. jQuery学习之八---文档处理
  10. 计算机硬件系统的安全,维护硬件系统的计算机安全论文
  11. LeetCode(303)——区域和检索 - 数组不可变(JavaScript)
  12. java 100个定时任务_Java定时任务解决方案
  13. 关闭SqlConnection的方法
  14. 在队列同步器中,同步队列为什么是双向链表,而等待队列是单链表?
  15. 微信小程序使用组件库
  16. jwplayer html插件,Typecho视频播放器插件JWPlayer
  17. itest考试切屏能检测出来吗_itest考试作弊怎么检测
  18. cdn对动态网站有作用吗_使用CDN对动态网站内容加速有效果吗
  19. Python网络爬虫之爬取微博热搜
  20. python读取批量txt文件

热门文章

  1. Signatures-based、Anomaly-based、Specification-based三种入侵检测方法的简介
  2. React 项目配置 Win10 WSL
  3. C语言实现strcpy和strcmp
  4. fiddler重放请求
  5. 什么样的企业需要舆情优化系统?什么样的企业需要手工监测?
  6. ORA-14400错误
  7. 品牌舆情总结及品牌修复,品牌舆情监测监控怎么做?
  8. 孤尽班第22天 -- 系统安全规约
  9. 【AI理论学习】对Transformer中Positional Encoding的理解
  10. 运行时异常一般异常的区别