问题:Java对象初始化方式主要有哪几种?分别是什么?
针对上面的问题,想必大家脑海中首先浮现出的答案是构造器,没错,构造器是Java中常用的对象初始化方式。

还有一种与构造器作用非常相似的是初始化块,它可以对Java对象进行初始化操作。下面主要阐述Java的初始化块及执行过程。

Java初始化块其实是Java类的成员之一,其语法格式如下:

[修饰符]{

  //初始化块的可执行代码

  ...

}

初始化块的修饰符只能是static,使用static修饰符的初始化块称为静态初始化块,后面会介绍到。

下面通过一段程序代码看看创建对象Dog时发生了什么。

public class Dog {

    //定义一个初始化块
{
System.out.println("第一个初始化块");
}
//定义第二个初始化块
{
System.out.println("第二个初始化块");
}
//定义无参的构造器
public Dog() {
System.out.println("Dog的无参构造器");
} public static void main(String[] args) { new Dog();
} }

运行结果为:

第一个初始化块
第二个初始化块
Dog的无参构造器

从运行结果可以看出:当创建一个Dog对象时,程序先执行初始化块后执行构造器,而且两个初始化的执行顺序是按照前后顺序执行的。

由于初始化块只在创建Java对象时隐士的执行(所有的初始化块全部执行),为了让程序更加的简洁和可读性更强,一般一个类里最多只有一个初始化块。

既然初始化块和构造器都是创建对象的时候执行,那么它们有什么区别呢?
从某种程度上来看,初始化块是构造器的补充,与构造器不同的是,初始化块是一段固定执行的代码,不能接收任何的参数,而构造器是可以接收参数的。如果程序中有两个构造器,并且它们有公共的无需接收参数的代码,则可以把这些相同的公共代码放到初始化块中,提高代码的可维护性。

当普通初始化块被static修饰时,则这个初始化块就是静态初始化块,也被称为类初始化块。

普通初始化块负责对对象进行初始化,而静态初始化块负责对类进行初始化,所以静态初始化块总是比普通初始化块先执行。

静态初始化块通常用于对类变量执行初始化处理,不能对实例变量进行初始化处理。

静态初始化块也是类的静态成员,仍然需要遵循静态成员不能访问非静态成员的规则,包括不能访问实例变量和实例方法。

初始化块执行的时候会一直上溯到java.lang.Object类,先执行Object的初始化块,再执行其父类的初始化块...最后才执行该类自己的初始化块。

下面看下这段代码的执行顺序结果:

class Biology{
static {
System.out.println("Biology的静态初始化块");
}
{
System.out.println("Biology的普通初始化块");
}
public Biology(){
System.out.println("Biology的无参构造器");
}
} class Animal extends Biology{
static {
System.out.println("Animal的静态初始化块");
}
{
System.out.println("Animal的普通初始化块");
}
public Animal(){
System.out.println("Animal的无参构造器");
}
public Animal(String name){
this();//调用同类中的重载构造器
System.out.println("Animal的带参构造器,name="+name);
}
} class Cat extends Animal{
static {
System.out.println("Cat的静态初始化块");
}
{
System.out.println("Cat的普通初始化块");
}
public Cat(){
//调用父类中带参数的构造器
super("Java典籍");
System.out.println("Cat的无参构造器");
}
} public class Test { public static void main(String[] args) {
new Cat();
System.out.println("=========");
new Cat();
} }

执行结果如下:

Biology的静态初始化块
Animal的静态初始化块
Cat的静态初始化块
Biology的普通初始化块
Biology的无参构造器
Animal的普通初始化块
Animal的无参构造器
Animal的带参构造器,name=Java典籍
Cat的普通初始化块
Cat的无参构造器
=========
Biology的普通初始化块
Biology的无参构造器
Animal的普通初始化块
Animal的无参构造器
Animal的带参构造器,name=Java典籍
Cat的普通初始化块
Cat的无参构造器

从上面的执行结果来看,第一次创建Cat对象时,由于系统还未有Cat对象,因此需要先加载并初始化Cat类,初始化Cat类会先执行其顶层父类的静态初始化块,再执行其直接父类的静态初始化块,最后才执行其本身的静态初始化块。

一旦Cat类初始化成功后,其在虚拟机中一直存在,当第二次再创建Cat对象时 无需再对Cat类进行初始化。

综上,一个类初始化的执行顺序为:父类静态初始化块,该类静态初始化块,父类普通初始化块,父类构造器,该类普通初始化块,该类构造器。

欢迎关注微信公众号【Java典籍】,收看更多Java技术干货!关注即送java全套资料一份

   ▼微信扫一扫下图↓↓↓二维码关注

 

Java的初始化块及执行过程详解的更多相关文章

  1. java静态初始化块的执行顺序

    先来观察下面的代码 package trr; class Root { static{ System.out.println("Root的静态初始化块"); } { System. ...

  2. Hadoop MapReduce执行过程详解(带hadoop例子)

    https://my.oschina.net/itblog/blog/275294 摘要: 本文通过一个例子,详细介绍Hadoop 的 MapReduce过程. 分析MapReduce执行过程 Map ...

  3. Hadoop学习之Mapreduce执行过程详解

    一.MapReduce执行过程 MapReduce运行时,首先通过Map读取HDFS中的数据,然后经过拆分,将每个文件中的每行数据分拆成键值对,最后输出作为Reduce的输入,大体执行流程如下图所示: ...

  4. mysql中SQL执行过程详解与用于预处理语句的SQL语法

    mysql中SQL执行过程详解 客户端发送一条查询给服务器: 服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果.否则进入下一阶段. 服务器段进行SQL解析.预处理,在优化器生成对应的 ...

  5. MySQL 语句执行过程详解

    MySQL 原理篇 MySQL 索引机制 MySQL 体系结构及存储引擎 MySQL 语句执行过程详解 MySQL 执行计划详解 MySQL InnoDB 缓冲池 MySQL InnoDB 事务 My ...

  6. ping命令执行过程详解

    [TOC] ping命令执行过程详解 机器A ping 机器B 同一网段 ping通知系统建立一个固定格式的ICMP请求数据包 ICMP协议打包这个数据包和机器B的IP地址转交给IP协议层(一组后台运 ...

  7. 一个 java 文件的执行过程详解

    平时我们都使用 idea.eclipse 等软件来编写代码,在编写完之后直接点击运行就可以启动程序了,那么这个过程是怎么样的? 总体过程 我们编写的 java 文件在由编译器编译后会生成对应的 cla ...

  8. JSP执行过程详解

    复习JSP的概念 JSP是Java Server Page的缩写,在传统的HTML页面中加入JSP标签和java的程序片段就构成了JSP. JSP的基本语法:两种注释类型.三个脚本元素.三个元素指令. ...

  9. IIS 内部运行机制及Asp.Net执行过程详解

    一直以来对一个Asp.net页面穿过IIS后就返回给浏览器一个HTML页面感觉很是神奇.虽然做技术这么长时间了,也曾经大致了解过一点来龙去脉,但是如果你真的问起我比较详细的过程,我还真的回答不上来,好 ...

随机推荐

  1. Java虚拟机——Java内存区域

    1.运行时区域 Java虚拟机在执行Java程序的时候会把它管理的内厝划分为若干个不同功能的数据区域,如图所示 首先是程序计数器,程序计数器可以理解为当前程序执行的字节码的行号指示器,计数器中的数据即 ...

  2. 利用tensorboard可视化checkpoint模型文件参数分布

    写在前面: 上周微调一个文本检测模型seglink,将特征提取层进行冻结,只训练分类回归层,然而查看tensorboard发现里面有histogram显示模型各个参数分布,看了目前这个训练模型参数分布 ...

  3. ASP.NET Core on K8S深入学习(3-2)DaemonSet与Job

    本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 上一篇<3-1 Deployment>中介绍了Deployment ...

  4. 全世界仅有的唯一最高LINUX版本的白菜路由,支持NAND记

    在上上篇 真千兆路由的极限之OPENWRT MAKE, 某品牌白菜价QCA9558/QCA9880/QCA8337N纯种组合OS搭建时记 里,有没有还记否之模式退一步,海阔天空 回到了远古时代的ar7 ...

  5. ZooKeeper系列(二)—— Zookeeper 单机环境和集群环境搭建

    一.单机环境搭建 1.1 下载 下载对应版本 Zookeeper,这里我下载的版本 3.4.14.官方下载地址:https://archive.apache.org/dist/zookeeper/ # ...

  6. 【Isabella Message】 【SPOJ - ISAB】【模拟】【矩阵的旋转】

    思路 题目链接 题意:题目中先给了一个N阶矩阵样子的字符,后给了一个mask,然后又给出你应该认识的一些单词,最后是让你输出最终字典序最小的一句话. 思路:根据题目要求模拟即可.这里会用到string ...

  7. CAD2015 C#二次开发 字体变形

    开发环境:VS2012问题描述:一个简单的WinForm窗口,一个群组控件和一个Label,都是微软雅黑12pxCAD2015下,看起来却不一样,一个明显细得多. CAD2014下,无此问题.实验了C ...

  8. Go语言框架:Beego vs Gin 的区别

    前言: 一切语言.技术或者框架,本质都是工具,工具的价值在于为使用者提供竞争优势. 一.Beego和Gin全方位比较 MVC Beego支持完整的MVC, Gin不支持完整的MVC(需要开发者自己实现 ...

  9. 合并多个jar包,并通过私服依赖

    背景:许多jar包在maven仓库中没有,项目如果添加了许多的本地jar包,别人拿到代码也无法编译 需求:将本地jar包上传至私服并设置依赖,如果jar包较多,但都从属于同一功能,需要合并为一个jar ...

  10. 【阿里云IoT+YF3300】4.Alink物模型之事件触发

    名词解释:设备的功能模型之一,设备运行时的事件,事件一般包含需要被外部感知和处理的通知信息,可包含多个输出参数.如,某项任务完成的信息,或者设备发生故障或告警时的温度等,事件可以被订阅和推送. 在工控 ...