• 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对象则不需要执行静态初始化块。

最新文章

  1. Emeditor批量修改文件编码格式(UTF-8)
  2. iOS 定位精度
  3. Bitwise AND of Numbers Range
  4. java Reentrant Lock
  5. rsync 同步文件
  6. 【转】./a.out 2>&1 > outfile
  7. hdu 2196 树形dp
  8. psutil--跨平台的进程管理
  9. spoj LCS
  10. 两个在线编写C++代码的网站
  11. 第五十九届冠军(使用C++设计一个类不能被继承)
  12. 编译预处理 -- 带参数的宏定义--【sky原创】
  13. Java之List排序
  14. Django模型层-多表操作
  15. 访问Google的办法
  16. java使用wait(),notify(),notifyAll()实现等待/通知机制
  17. Jenkins使用TFS部署
  18. DevExpress v17.2新版亮点——VCL篇(一)
  19. 下列没有直接采用XML技术的是( )
  20. 字符串:SAM

热门文章

  1. BlockingQueue-----多线程(一)
  2. 074——VUE中vuex之模块化modules开发实例
  3. Android轮播图Banner的实现
  4. SQL Server 调优系列基础篇 - 并行运算总结(二)
  5. 【转载】Android Bug分析系列:第三方平台安装app启动后,home键回到桌面后点击app启动时会再次启动入口类bug的原因剖析
  6. >CH07-cubemap
  7. jQuery trigger()以及注意事项
  8. 【Cocos2d-X(1.x 2.x) 修复篇】iOS6 中 libcurl.a 无法通过armv7s编译以及iOS6中无法正常游戏横屏的解决方法
  9. git stash,git cherry-pick
  10. 【转】游戏buff设计参见