问题: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. exe4j打包--jar打包exe

    本文重点介绍如何将我们写的java代码打包成在电脑上可以运行的exe文件.这里只介绍直接打包成exe的方法,至于打包成exe安装包下节介绍 test 软件准备 exe4j集合包下载地址(下节内容也在这 ...

  2. java web 加载Spring --web.xml 篇

    spring是目前最流行的框架.今天谈谈对spring的认识 起步 javaweb中我们首先会遇到的配置文件就是web.xml,这是javaweb为我们封装的逻辑,不在今天的研究中.略过,下面是一个标 ...

  3. element ui 退出功能

    <template> <el-container class="home-wrapper"> <el-header> <el-row ty ...

  4. 实现API优先设计的重要性和实现方式

    应用API优先的方法意味着设计API时,使其具有一致性和适应性,无论应用于哪些开发项目.对API使用API​​描述语言(如OpenAPI)是关键,因为它有助于建立API与其他程序通信的枢纽,即使这些系 ...

  5. springboot整合solr

    上一篇博客中简要写了solr在windows的安装与配置,这一篇接上文写一下springboot整合solr,代码已经上传到github,传送门. 1.新建core并配置schema 上篇博客中已经有 ...

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

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

  7. 2014-09~11Removeapp配置篇

    金蝶ERP软件  Windows REMOVEAPP 功能需求:将服务器端金蝶客户端软件直接在本地实现,只需输入服务器密码即可启动该软件 配置需求:可用的金蝶软件,SERVER2008 或更高(必须激 ...

  8. springboot的log4j配置与logback配置

    log4j配置的依赖 <!-- 删除pom.xml文件中所有对日志jar包的引用--> <dependency> <groupId>org.springframew ...

  9. 内容协商在视图View上的应用【享学Spring MVC】

    每篇一句 人生很有意思:首先就得活得长.活得长才能够见自己,再长就可以见众生 前言 在经过 前两篇 文章了解了Spring MVC的内容协商机制之后,相信你已经能够熟练的运用Spring MVC提供的 ...

  10. CSS3-------弹簧特效

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...