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讲义——初始化块
随机推荐
- Vue 使用插件nprogress页面加载进度条
下载 npm i nprogress 在main.js中引入: import App from './App' import VueRouter from 'vue-router' import ro ...
- HPA 弹性伸缩
在k8s中,我们使用pod对外提供服务,这个时候,需要以下两种情形需要关注: pod因为不明原因挂掉,导致服务不可用 pod在高负载的情况下,不能支持我们的服务 如果人工监控pods,人工调整副本,那 ...
- python+appium拉起APP
1.首先需要完成环境配置: JDK:https://www.cnblogs.com/wenlongma/p/17103062.html: SDK:https://www.cnblogs.com/w ...
- loadrunner添加头部
web_add_auto_header("token_id", "{token_id}"); 或 web_add_header("token_id&q ...
- IDEA快键键设置为Eclipse快捷键
一.基础修改,参考这个就可以了 https://jingyan.baidu.com/article/6dad5075a5f7b4e122e36e4b.html 二.其他需要手动配置的快捷键修改(主要是 ...
- mybatis_19
id username birthday sex address 1 王五 2 10 张三 2014-07-10 1 北京市 16 张小明 1 河南郑州 22 陈小明 1 河南郑州 24 张三丰 1 ...
- Python中列表、元组、字典的区别
列表: 列表是一种数据结构,每一个元素对应一个值.例如:list=['a','b','c'] 访问列表数据通过下标的方式来进行数据访问,list[下标] list.append(i) 添加数据 de ...
- Cesium渲染模块之Shader
1. 引言 Cesium是一款三维地球和地图可视化开源JavaScript库,使用WebGL来进行硬件加速图形,使用时不需要任何插件支持,基于Apache2.0许可的开源程序,可以免费用于商业和非商业 ...
- 使用web client对 vcenter 进行补丁升级
使用web client对 vcenter 进行补丁升级 背景:最近VMware官网发布了最新的VMware vCenter Server 7.0 iso补丁文件,为了安全起故此对vCenter 进行 ...
- MySQL学习(八)BLOB和TEXT区别
:都市为存储很大数据而设计的字符串数据类型,分别采用二进制和字符方式存储.当blob和text值太大时,innodb会使用专门的"外部"存储区域来进行存储,此时每个值在行内需要1~ ...