• java中初始化块的执行顺序在构造器之前,多个初始化块之间定义在前的先执行。如下:
public class InitialBlockTest {

	// The first one
{
System.out.println("The first initial block");
} // The second one
{
System.out.println("The second initial block");
} // The constructor
public InitialBlockTest() {
System.out.println("Constructor of this class without any parameters");
} public static void main(String args[]) {
new InitialBlockTest();
} // The third one
{
System.out.println("The third initial block");
} }

 结果如下:

The first initial block
The second initial block
The third initial block
Constructor of this class without any parameters

  • 类中声明变量指定初始值也是初始化代码,与初始化块相比,其执行顺序由定义先后决定。
public class InitTest {

	{
a = 6;
} int a = 9; public static void main(String args[]) {
System.out.println(new InitTest().a);
}
}

 结果为:9

程序先为变量a分配内存,接着对其初始化。由于初始化块在前故先执行代码{ a = 6 },再执行

a = 9; 故a的值为9。

  • 与构造器一样,创建一个java对象时,不仅会执行该类的初始化块和构造器,而且会一直上溯到Object类。如下:
public class Test {

	public static void main(String args[]) {

		new Xiaomi();
}
} class Phone { {
System.out.println("Initial block in class Phone");
} public Phone() {
System.out.println("Constructor of Phone");
}
} class Xiaomi extends Phone { {
System.out.println("Initial block in class Xiaomi");
} public Xiaomi() {
System.out.println("Constructor of Xiaomi");
}
}

 结果为:

Initial block in class Phone
Constructor of Phone
Initial block in class Xiaomi
Constructor of Xiaomi

  • 静态初始化块是由static修饰的初始化块,属于类的静态成员。通常用于对类变量执行初始化处理,系统在类初始化

阶段执行静态初始块。如下:

public class Test {

	public static void main(String args[]) {

		new Xiaomi();
new Xiaomi();
}
} class Phone { static {
System.out.println("Static block of Phone");
} {
System.out.println("Block of Phone");
} public Phone() {
System.out.println("Constructor of Phone");
}
} class Xiaomi extends Phone { static {
System.out.println("Static block of Xiaomi");
} {
System.out.println("Block of Xiaomi");
} public Xiaomi() {
System.out.println("Constructor of Xiaomi");
}
}

 结果如下:

Static block of Phone
Static block of Xiaomi
Block of Phone
Constructor of Phone
Block of Xiaomi
Constructor of Xiaomi

Block of Phone
Constructor of Phone
Block of Xiaomi
Constructor of Xiaomi

类初始化阶段先执行最顶层父类的静态初始化块,然后依次向下,直到当前类的静态初始化块。

对象初始化阶段先执行最顶层父类的初始化块与构造器,一次向下,直到当前类的初始化块与构造器。

第一次创建Xiaomi对象时,因为系统还不存在Xiaomi类,因此需要加载初始化Xiaomi类,会先执行其顶层父类的静态初始化块。

一旦Xiaomi类初始化成功后,其后创建Xiaomi对象则不需要执行静态初始化块。

java初始化块执行顺序的更多相关文章

  1. java代码块执行顺序

    父类 public class Father { public Father() { System.out.println("父类构造PUBLIC father"); } stat ...

  2. JVM 类加载过程、初始化、主动引用、被动引用、静态初始化块执行顺序

  3. Java初始化块及执行顺序

    理解 初始化块又称为代码块.属于类中的第四大成员.本质上是一个方法,它也有方法体,但没有方法名,没有参数,没有返回,而且也不是通过对象或类名显式调用,而是通过隐式调用 是构造器的补充 语法 [修饰符] ...

  4. JAVA基础2——类初始化相关执行顺序

    类初始化相关执行顺序 几个概念说明 代码块的含义与作用 static静态代码块: 一般用于初始化类中的静态变量.比如:给静态的数组或者list变量赋初值.使用static静态代码块进行初始化与直接在定 ...

  5. Java 初始化块

    初始化块是和成员变量.成员函数一个级别的.一般用于类的初始化,也可执行其他java代码,作用和构造函数相同. 创建对象时,初始化块在构造函数之前执行. 初始化块分为普通初始化块.静态初始化块. 普通初 ...

  6. Java类成员变量、普通成员变量、初始化块、构造方法的初始化和执行顺序

    结论:执行的大致顺序如下, (1) 在一个不存在继承的类中:初始化static变量,执行static初始化块-->初始化普通成员变量(如果有赋值语句),执行普通初始化块-->构造方法 (2 ...

  7. Java中普通代码块,构造代码块,静态代码块执行顺序

    //执行顺序:(优先级从高到低.)静态代码块>mian方法>构造代码块>构造方法. 其中静态代码块只执行一次.构造代码块在每次创建对象是都会执行. 1 普通代码块 1 //普通代码块 ...

  8. java中的代码块执行顺序

    /* 代码块:在Java中,使用{}括起来的代码被称为代码块. 根据其位置和声明的不同,可以分为 局部代码块:局部位置,用于限定变量的生命周期. 构造代码块:在类中的成员位置,用{}括起来的代码.每次 ...

  9. Java中static代码块,{}大括号代码块,构造方法代码块执行顺序!

    注:下列代码中的注释都是JUnit4单元测试运行结果. 首先,没有父类的(父类是Object)的类A package Static.of; public class A { { System.out. ...

随机推荐

  1. OC Copy基本使用(深拷贝和浅拷贝)

     首先,什么是copy? Copy的字面意思是“复制”.“拷贝”,是一个产生副本的过程. 常见的复制有:文件复制,作用是利用一个源文件产生一个副本文件. 特点:1.修改源文件的内容,不会影响副本文件: ...

  2. angular2使用ng g component navbar创建组件报错

    Error: ELOOP: too many symbolic links encountered, stat 'C:\Users\inn\angulardemo\node_modules\@angu ...

  3. spring boot学习(十三)SpringBoot缓存(EhCache 2.x 篇)

    SpringBoot 缓存(EhCache 2.x 篇) SpringBoot 缓存 在 Spring Boot中,通过@EnableCaching注解自动化配置合适的缓存管理器(CacheManag ...

  4. display: table 实现menu等高居中排列

    display: table 属性,顾名思义,就是就像表格一样陈列元素,设置这个属性之后,就具有了表格所特有的某些特性,比如居中对齐之类的. 本篇文章要实现的需求也是非常常见的——左侧栏menu菜单居 ...

  5. oracle查询在当前数据库下当前用户拥有的表语句

    1.查询表的数目: select count(*) from tabs select count(*) from user_tables 2.查询用户拥有哪些表: select * from tabs ...

  6. maven 构建war包时排除web.xml

    在使用maven构建项目的war包时,有时并不需要src/webapp/WEB-INF/下的一些文件. 这时可以通过maven-war-plugin创建配置来排除这些文件.下面贴出我平时使用的pom. ...

  7. php通过$_SERVER['HTTP_USER_AGENT']获取浏览器useAgent

    php通过$_SERVER['HTTP_USER_AGENT']获取浏览器useAgent

  8. CreateFile DeviceIoControl dwIoControlCode——应用程序与驱动程序通信

    在“进程内存管理器中”的一个Ring0,Ring3层通信问题,之前也见过这样的代码,这次拆分出来详细总结一下. 先通过CreateFile函数得到设备句柄,CreateFile函数原型: HANDLE ...

  9. 1017 A除以B

    本题要求计算 A/B,其中 A 是不超过 1000 位的正整数,B 是 1 位正整数.你需要输出商数 Q 和余数 R,使得 A=B×Q+R 成立. 输入格式: 输入在一行中依次给出 A 和 B,中间以 ...

  10. vue 和 react 选择

    经典 react 还是有其优点的, 生态更丰富,  更容易 测试 和 调试, 更适合超大型应用,  更适合app,  weex不一定能到达 reactNative的高度 而vue , 更为直观, 上手 ...