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

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

执行父类的实例初始化块

执行父类的构造函数

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

执行当前类的构造函数

实例初始化块的要点

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

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

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

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

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

  1. java 代码块_详解java中的四种代码块

    在java中用{}括起来的称为代码块,代码块可分为以下四种: 一.简介 1.普通代码块: 类中方法的方法体 2.构造代码块: 构造块会在创建对象时被调用,每次创建时都会被调用,优先于类构造函数执行. ...

  2. java static 函数_详解java中的static关键字

    Java中的static关键字可以用于修饰变量.方法.代码块和类,还可以与import关键字联合使用,使用的方式不同赋予了static关键字不同的作用,且在开发中使用广泛,这里做一下深入了解. 静态资 ...

  3. java comparator相等_详解Java中Comparable和Comparator接口的区别

    详解Java中Comparable和Comparator接口的区别 发布于 2020-7-20| 复制链接 摘记: 详解Java中Comparable和Comparator接口的区别本文要来详细分析一 ...

  4. Java implement意思_详解JAVA中implement和extends的区别

    详解JAVA中implement和extends的区别 发布于 2020-4-14| 复制链接 摘记: 详解JAVA中implement和extends的区别extends是继承父类,只要那个类不是声 ...

  5. java sleep唤醒_详解Java中的线程让步yield()与线程休眠sleep()方法

    Java中的线程让步会让线程让出优先级,而休眠则会让线程进入阻塞状态等待被唤醒,这里我们对比线程等待的wait()方法,来详解Java中的线程让步yield()与线程休眠sleep()方法 线程让步: ...

  6. java runnable 异常_详解Java中多线程异常捕获Runnable的实现

    详解Java中多线程异常捕获Runnable的实现 1.背景: Java 多线程异常不向主线程抛,自己处理,外部捕获不了异常.所以要实现主线程对子线程异常的捕获. 2.工具: 实现Runnable接口 ...

  7. java 标量替换_详解jvm中的标量替换

    概述 通常在java中创建一个对象,大家都认为是在堆中创建. 在jdk6开始有逃逸分析,标量替换等技术,关于在堆中创建对象不再绝对. 关于标量替换,通过以下几点进行概述: 逃逸分析 标量替换是什么 测 ...

  8. java内部格式_详解java内部类的访问格式和规则

    详解java内部类的访问格式和规则 1.内部类的定义 定义一个类来描述事物,但是这个事物其中可能还有事物,这时候在类中再定义类来描述. 2.内部类访问规则 ①内部类可以直接访问外部类中的成员,包括私有 ...

  9. java 引用传递_详解java的值传递、地址传递、引用传递

    详解java的值传递.地址传递.引用传递 一直来觉得对值传递和地址传递了解的很清楚,刚才在开源中国上看到一篇帖子介绍了java中的值传递和地址传递,看完后感受颇深.下边总结下以便更容易理解. 按照以前 ...

最新文章

  1. 厉害!重庆参加马拉松赛人数7年翻10倍,今年区县马拉松赛事将大增
  2. 三个打印函数printf()/sprintf()/snprintf()区别
  3. AutoLayout ScrollView在ios7下无法滑动
  4. 牛客题霸 [进制转换] C++题解/答案
  5. JPA字段长度 Mysql数据库
  6. 通过继承来实现注解方式的属性注入
  7. vue + elementUI 框架下给el-table 增加一条数据,默认滚动条定位到表格的最底部
  8. esp8266教程:esp8266使用mqtt连接百度智能云
  9. java 微信卡券开发 --创建微信卡券
  10. ALOHA协议与CSMA协议
  11. python+openCV使用SIFT算法实现印章的总相似度检测
  12. 用python编阶层
  13. 李兴华内部JAVA培训视频 (难找啊)
  14. 用NEON intrinsic实现RGB转YUV420SP(NV12)
  15. python元组切片_Python中如何对元组进行切片
  16. java 贪吃蛇 地狱模式_贪吃蛇大作战4.4.7版
  17. 无形装逼,最为致命——玩LOL那些有趣的台词
  18. MMSeg错误:RuntimeError: Default process group has not been initialized
  19. DNS域名解析成IP地址------设置主从域名服务器
  20. python:实现EEMD算法(附完整源码)

热门文章

  1. NSString文本替换
  2. google文件出错啦,发生浏览器错误!
  3. gif动图表情包如何制作?教你一键生成gif表情包
  4. Java中三种代理方式—— 静态代理与两种动态代理的实现机制
  5. 【PTA】7-7 大炮打蚊子
  6. 北通xbox360模拟器_如何将无线Xbox 360控制器连接到计算机
  7. solr mysql增量导入_10.Solr4.10.3数据导入(DIH全量增量同步Mysql数据)
  8. Navicat Premium 12的过期激活,问题解决的心路历程
  9. execute,executeQuery和executeUpdate的区别
  10. ue4 改变枢轴位置_[UE4蓝图][Materials]虚幻4中可互动的雪地材质完整实现(一)