详解Java中的实例初始化块(IIB)
作者:laozhang 发布时间:2023-06-08 08:35:46
在 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() 语句后,就转而先执行父类的构造函数。
因此,在继承体系中,实例初始化块和构造函数的执行顺序如下
执行父类的实例初始化块
执行父类的构造函数
执行当前类的实例初始化块
执行当前类的构造函数
实例初始化块的要点
我们一起来回顾下实例初始化块的要点。
每次创建新实例时都会运行实例初始化块
初始化块按它们在类中出现的顺序运行
如果存在父类,则首先会实例化父类然后在调用当前类的实例初始化块,最后再调用当前类的构造函数。


猜你喜欢
- 代码public class LamdaDemo{ public static void main( String[] args
- 关于滑动冲突在Android开发中,如果是一些简单的布局,都很容易搞定,但是一旦涉及到复杂的页面,特别是为了兼容小屏手机而使用了Scroll
- 线程可以理解为下载的通道,一个线程就是一个文件的下载通道,多线程也就是同时开启好几个下载通道。当服务器提供下载服务时,使用下载者是共享带宽的
- 在C#中,在处理字符串拼接的时候,使用StringBuilder的效率会比硬拼接字符串高很多。到底有多高,如下:static void Ma
- 代理模式也是一种非常常见的设计模式。了解Spring框架的都知道,Spring AOP 使用的就是 * 模式。今天就来系统的重温一遍代理模
- 在分布式系统中,配置文件散落在每个项目中,难于集中管理,抑或修改了配置需要重启才能生效。下面我们使用 Spring Cloud Config
- 今天遇到这样一个bug:客户端POST到服务器的一段数据导致服务器端发生未知异常。服务器端确认是编码转换错误。于是截取网络数据包进行分析,发
- 使用@Tolerate实现冲突兼容使用Lombok能够减少程序员的重复工作提高工作效率,而Lombok的注解基本是基于标准的(如,标准的Bu
- 多线程可以说是面试官最喜欢拿来问的题目之一了,可谓是老生之常谈,不管你是新手还是老司机,我相信你一定会在面试过程中遇到过有关多线程的一些问题
- VSCode配置C语言环境VSCode是一款强大编辑器,开源,免费,海量插件,支持很多编程语言。其中的很多功能可以大大地提高我们的学习与工作
- 这个进度条可以反映真实进度,并且完成百分比的文字时随着进度增加而移动的,所在位置也恰好是真实完成的百分比位置,效果如下:思路如下:第一部分是
- SpringBoot整合Log4j2以及配置详解SpringBoot整合Log4j2步骤:1、删除spring-boot-starter-p
- Commons Beanutils是Apache开源组
- 单例模式一个类只有一个实例,并且可以全局访问使用应用场景如账户管理类,数据库操作类等(某个对象频繁被访问使用)常用方式饿汉式懒汉式同步加锁D
- SpringCloudStream配置以下配置摘自《SpringCloud微服务实战》,配置主要包括两大部分:Stream配置(基础配置、通
- java通过IP解析地理位置在项目开发中,需要在登录日志或者操作日志中记录客户端ip所在的地理位置。目前根据ip定位地理位置的第三方api有
- 安装方式:1):通过ppa(源) 方式安装.2):通过官网安装包安装.JDK官网下载地址一:使用ppa(源)方式安装:1):添加ppa源su
- ELK是三款软件的简称,分别是Elasticsearch、Logstash、Kibana组成,在发展的过程中,又有新成员Beats的加入,所
- 将字母全部转换为大写或小写,在C#编程中是一个非常常见的功能。在开发过程中,经常需要验证用户登录,用户在输入用户名时可能不区分大小写,如果我
- 回调在 * 中定义为:在计算机程序设计中,回调函数,是指通过函数参数传递到其他代码的,某一块可执行代码的引用。其目的是允许底层代码调用在高