关于java中三种初始化块的执行顺序
许多小伙伴对于java中的三种初始化块的执行顺序一直感到头疼,接下来我们就来分析一下这三种初始化块到底是怎么运行的。有些公司也会将这个问题作为笔试题目。
下面通过一段代码来看看创建对象时这么初始化块是如何运行的
package com.hxy;
public class CodeBlock{
public static void main(String[] args) {
new HelloB();
// new HelloB();
} }
class HelloA{
//无参构造器
public HelloA(){
System.out.println("Hello A");
}
//初始化块
{
System.out.println("I'm A");
}
//静态初始化块
static{
System.out.println("Static A");
}
}
class HelloB extends HelloA{
public HelloB(){
System.out.println("Hello B");
}
{
System.out.println("I'm B");
}
static{
System.out.println("Static B");
}
}
运行结果如下图所示:

从运行结果来看,在新创建一个对象的时候,程序先执行初始化块,再执行构造器。
当普通初始化块被static修饰后就变成了静态初始化块,也被称作类初始化块。
普通初始化块是对对象进行初始化,而静态初始化块是对类进行初始化。所以静态初始化块要比普通初始化块先执行。
从上面的运行结果看。当第一次创建HelloB对象时,要先加载并初始化HelloB类。初始化HelloB类会先执行它父类的静态初始块(Static A),然后再执行它的静态初始化块。
综上所述:初始化块的执行顺序为:静态初始化块、普通初始化块、构造器。
接下来再看创建两个HelloB对象时它们又是怎么运行的。下面是运行结果:

从运行结果来看,可能出乎一些小伙伴的预料。
静态初始化块只在第一次创建对象时执行,也就是说不管创建几次对象。静态初始化块都只会执行一次。普通代码块和构造器则是创建几次执行几次,且普通代码块比构造器先执行。
关于java中三种初始化块的执行顺序的更多相关文章
- java中的静态代码块等执行顺序
http://www.cnblogs.com/naruto469/p/3608459.html public class Print { 2 3 public Print(String s){ 4 S ...
- java中的静态初始化块
Java 中可以通过初始化块进行数据赋值.如: 在类的声明中,可以包含多个初始化块,当创建类的实例时,就会依次执行这些代码块.如果使用 static 修饰初始化块,就称为静态初始化块. 需要特别注意: ...
- java中静态初始化块的执行顺序
在java中,其应该是先于所有的方法执行. 下面是测试代码: public class Test1 { static{ System.out.println("执行静态初始化块test1.. ...
- Java初始化块及执行顺序
理解 初始化块又称为代码块.属于类中的第四大成员.本质上是一个方法,它也有方法体,但没有方法名,没有参数,没有返回,而且也不是通过对象或类名显式调用,而是通过隐式调用 是构造器的补充 语法 [修饰符] ...
- java静态初始化块的执行顺序
先来观察下面的代码 package trr; class Root { static{ System.out.println("Root的静态初始化块"); } { System. ...
- java中三种方式获得类的字节码文件对象
package get_class_method; public class ReflectDemo { /** * @param args */ public static void main(St ...
- java类的初始化块/执行顺序,实例化对象数据赋值
java里初始化一个类的对象,通过初始化快或者构造方法进行数据赋值.与其相关的执行代码有这么几种: 静态初始化块 初始化块 构造方法 静态初始化块 静态初始化块只在类加载时执行一次,同时静态初始化块只 ...
- 请运行TestStaticInitializeBlock.java示例,观察输出结果,总结出“静态初始化块的执行顺序”。
答:执行顺序:静态初始化块->初始化块->构造函数 静态初始化块:在第一次加载类时执行,与对象的创建无关. 构造代码块:在调用构造方法时执行. 构造函数:在调用构造函数时执行.
- Java中子类和父类相关方法的执行顺序
无意中看到下面一个题目,大家一起来看看最后的输出结果是什么.反正我看完之后,用IDE测试后感觉知识点得到巩固了. /** * 函数执行顺序测试 * Created by 萌小Q on 2017/5/1 ...
随机推荐
- kubernetes-单机实验(入门)
一.安装kubernetes 实验环境: centos7.0(建议使用7.5版本) 实验机器IP:192.168.1.4 安装方式:yum安装 需求环境:Tomcat+Mysql 1:关闭防火 ...
- 【CentOS7】curl命令
[CentOS7]curl命令 转载: 参考 https://www.thegeekstuff.com/2012/04/curl-examples/ http://www.cnblogs.com/gb ...
- Django 之day02,必会知识点
静态文件配置******* 为什么用户在浏览器中输入的网址能够访问到对应的资源, 前提是后端提前开设该资源的访问,在urls.py文件中进行配置该路由, 如果我的后端没有开设相关的资源,用户是无法访问 ...
- spring源码学习(三)--spring循环引用源码学习
在spring中,是支持单实例bean的循环引用(循环依赖)的,循环依赖,简单而言,就是A类中注入了B类,B类中注入了A类,首先贴出我的代码示例 @Component public class Add ...
- Nginx代理缓存功能
Nginx代理缓存功能 Nginx缓存主要是用于减轻后端服务器的负载,提高网站并发量,提升用户体验度. 注意:Nginx反向代理的缓存功能是由ngx_http_proxy_module提供, ...
- java嵌套接口
java嵌套接口 package object; class A { //嵌套在类中的接口,可以被private,protected,default和public四种权限修饰 interface B ...
- 一步一步解决centos6.5配置无线网卡的问题
1.配置本地yum源 [local] name=local baseurl=file:///mnt/cdrom enable=1 gpgcheck=0 2.安装libnl rpm -ivh /mnt/ ...
- 北京国际机场T3行李运维平台开发记录
说明 该项目是一个后台管理型网站项目,供北京国际机场T3航站楼行李调度运维部门使用,开发时间一个半月,我负责所有的前端开发.后端开发.API接口文档设计与编写.服务部署和交付. 整个网站具备的功能有: ...
- 简单实现vue列表点击某个高亮显示
比如ul下有4个li元素. 给每个li绑定点击事件@click="select_li(index),然后这个点击时间会将一个全局变量 selectLi 赋值为 index 的值. 然后在每个 ...
- Python—类和实例对象
面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可 ...