Java的初始化块
三种初始化数据域的方法:
- 在构造器中设置值
- 在声明中赋值
- 初始化块(initialization block)
初始化块
在一个类的声明中,可以包含多个代码块。只要构造类的对象,这些块就会被执行。
class Employee {
private static int nextId;
private int id;
private String name;
private double salary;
// object initialization block
{
id = nextId;
nextId++;
}
}
在上面这个示例中,无论使用哪个构造器构造对象,id 域都在对象初始化块中被初始化。首先运行初始化块,然后才运行构造器的主体部分。
初始化块这种机制不是必需的,也不常见。通常会直接将初始化代码放在构造器中。
由于初始化数据域有多种途径,所以列出构造过程的所有路径可能相当混乱。下面是调用构造器的具体处理步骤:
- 所有数据域被初始化为默认值(0、false 或 null)
- 按照在类声明中出现的次序,依次执行所有域初始化语句和初始化块
- 如果构造器第一行调用了第二个构造器,则执行第二个构造器主体
- 执行这个构造器的主体
静态的初始化块
可以通过提供一个初始化值,或者使用一个静态的初始化块来对静态域进行初始化。
前面已经介绍过第一种机制(提供一个初始化值):private static int nextId = 1;
如果对类的静态域进行初始化的代码比较复杂,那么可以使用静态的初始化块。将代码放在一个块中,并标记关键字 static。下面是一个示例。其功能是将雇员 ID 的起始值赋予一个小于 10000 的随机整数。
// static initialization block
static {
Random generator = new Random();
nextId = generator.nextInt(lOOOO);
}
在类第一次加载的时候,将会进行静态域的初始化。与实例域一样,除非将它们显式地设置成其他值,否则默认的初始值是 0、false 或 null。所有的静态初始化语句以及静态初始化块都将依照类定义的顺序执行。
参考资料
《Java核心技术卷一:基础知识》(第10版)第 4 章:对象与类 4.6.7 初始化块
Java的初始化块的更多相关文章
- Java的初始化块及执行过程详解
问题:Java对象初始化方式主要有哪几种?分别是什么?针对上面的问题,想必大家脑海中首先浮现出的答案是构造器,没错,构造器是Java中常用的对象初始化方式. 还有一种与构造器作用非常相似的是初始化块, ...
- java静态初始化块的执行顺序
先来观察下面的代码 package trr; class Root { static{ System.out.println("Root的静态初始化块"); } { System. ...
- Java的初始化块、静态初始化块、构造函数的执行顺序及用途探究
Java与C++有一个不同之处在于,Java不但有构造函数,还有一个”初始化块“(Initialization Block)的概念.下面探究一下它的执行顺序与可能的用途. 执行顺序 首先定义A, B, ...
- 什么是Java实例初始化块
在本篇文章,我将会使用一个例子展示什么是实例变量初始化块,实例初始化块和静态初始化块,然后说明在Java中实例初始化块是如何工作的. 执行顺序 查看下面的代码,你知道哪个先执行吗? package s ...
- java中初始化块、静态初始化块和构造方法
(所谓的初始化方法init()是另一回事, 在构造方法之后执行, 注意不要混淆) 在Java中,有两种初始化块:静态初始化块和非静态初始化块.它们都是定义在类中,用大括号{}括起来,静态代码块在大括号 ...
- java实例初始化块
实例初始化程序块用于初始化实例数据成员. 它在每次创建类的对象时运行.实例变量的初始化可以是直接的,但是可以在初始化实例初始化块中的实例变量时执行额外的操作. 什么是实例初始化块的使用,我们可以直接分 ...
- java静态初始化块(静态域)
1. 类变量的初始化可通过静态初始化块来进行. 代码放在一对大括号内,大括号前用static修饰:static {……} 一个类可定义1个或多个静态初始化块. 静态初始化块会在加载时调用而且只被调用一 ...
- Java 静态初始化块等的执行顺序
实例代码 package text; class Root { static{ System.out.println("Root的静态初始化块"); } { System.out. ...
- Java笔记: 初始化块
Java语言提供了很多类初始化的方法,包括构造器.初始化器等.除了这两种方法之外,我们还可以用初始化块(initialization block)来实现初始化功能. 基本语法 初始化块是出现在类声明中 ...
- 疯狂java讲义——初始化块
随机推荐
- oneDNN
目录 oneDNN卷积思路 debug捆绑套路 jit_avx2_convolution_fwd_t::execute_forward( 整个文件oneDNN/src/cpu/x64/jit_avx2 ...
- jxg项目Day3 -数据库
可以通过 DOS 命令启动 MySQL 服务,点击"开始"菜单,在搜索框中输入"cmd",以管理员身份运行,按回车键,弹出命令提示符界面.mysql启动:net ...
- Windows下fmt库的链接与使用
下载源码. 使用mingw编译源码.注意设置cmake文件的产生路径.pkgconfig文件的产生路径(windows下用不到产生的pc文件).库的安装路径. make -j8 install. 新建 ...
- QImageReader(Writer)支持格式变少的解决方法
首发于我的个人博客:xie-kang.com 博客内有更多文章,欢迎大家访问 原文地址 获取程序支持的图片格式: #include "mainwindow.h" #include ...
- 修改/编辑jar包
替换或者导入jar包时,jar包被自动压缩,springboot规定嵌套的jar包不能在被压缩的情况下存储. 解决(本文以升级ojdbc包为例): 使用jar命令解压jar包,在压缩包外重新替换jar ...
- day1 第一个程序“Hello world!”
程序运行机制 源程序(.java文件)->java编译器->字节码(.class文件)->类装载器->字节码校验器->解释器->操作系统平台Java源码后缀名:.j ...
- 【Beat】Scrum Meeting 1
时间:2021年6月26日 1.各个成员今日完成的任务以及贡献小时数 姓名 今日完成任务 贡献小时数 鑫 编写软件的功能测试方案文档,录制视频演示软件系统安装配置过程 4 荣娟 编写软件的功能测试方案 ...
- App 用户新体验——Agora Native SDK 3.4.0
声网Agora Native SDK 3.4.0 本月已正式上线.新版本不仅增加了更丰富的实时美声音效.屏幕共享.虚拟节拍器等功能,同时在 SDK 的稳定性.兼容性及安全合规上做了大幅度升级,希望为 ...
- 使用 Agora 为Android APP添加视频直播
add-live-streaming-to-your-android-app-using-agora-featured1024×512 121 KB 视频互动直播是当前比较热门的玩法,我们经常见到有P ...
- day08-自定义转换器&处理JSON&内容协商
自定义转换器&处理JSON&内容协商 1.自定义转换器 1.1基本介绍 SpringBoot 在响应客户端请求时,将提交的数据封装成对象时,使用了内置的转换器,也就是自动帮我们封装对象 ...