java 初始化块_Java初始化块

1、使用初始化块

[修饰符]{

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

}

初始化块虽然也是Java类的一种成员,但它没有名字,也就没有标识,因此无法通过类、对象来调用初始化块。初始化块只在创建Java对象时隐式执行,而且在执行构造器之前执行。

普通初始化块、声明实例变量指定的默认值都可以是对象的初始化代码,他们的执行顺序与源代码中的排列顺序相同。如下代码

public classInstanceInitTest {

{

a= 6;

}int a = 9;public static voidmain(String[] args) {//TODO Auto-generated method stub//输出结果为9

System.out.println(newInstanceInitTest().a);

}

}

当Java创建一个对象时,系统先为该对象的所有实例变量分配内存,接着程序开始对这些实例变量进行初始化,其初始化的顺序是:先执行初始化块或声明实例变量时指定的初始值(这两个地方指定初始值的执行允许与它们在源代码中的排列顺序相同),再执行构造器力指定的初始值。

如果两个构造器中有相同的初始化代码,且这些初始化代码无须接受参数,就可以把它们放在初始化块中定义。

2、静态初始化块

如果定义初始化块时使用了static修饰符,则这个初始化块就变成了静态初始化块。静态初始化块时类相关的,系统将在类初始化阶段执行静态初始化块,而不是在创建对象时才执行。因此静态初始化块总是比普通初始化块先执行。

下面创建三个类:Root、Mid和Leaf,这三个类都提供了静态初始化块和普通初始化块,而Mid类中还使用了this调用重载的构造器,而Leaf使用了super显示调用父类指定的构造器。

classRoot

{static{

System.out.println("Root的静态初始化块");

}

{

System.out.println("Root的普通初始化块");

}

Root()

{

System.out.println("Root的无参构造函数");

}

}class Mid extendsRoot

{static{

System.out.println("Mid的静态初始化块");

}

{

System.out.println("Mid的普通初始化块");

}publicMid()

{

System.out.println("Mid的无参构造函数");

}publicMid(String msg)

{this();

System.out.println("Mid的带参构造函数,其参数值为:"+msg);

}

}class leaf extendsMid

{static{

System.out.println("leaf的静态初始化块");

}

{

System.out.println("leaf的普通初始化块");

}publicleaf()

{

System.out.println("leaf的无参构造函数");

}

}public classInstanceInitTest {public static voidmain(String[] args) {//TODO Auto-generated method stub

newleaf();newleaf();

}

}

23d4cc1553a809508c75602669e8d95d.png

从结果来看,第一次创建一个leaf对象时,因为系统中还不存在Leaf类,因此需要先加载并初始化Leaf类,初始化Leaf类时先执行其顶层父类的静态初始化块,再执行其直接父类的静态初始话块,最后才执行Leaf本身的静态初始话块。

一旦初始化Leaf类初始化后,Leaf类在该虚拟机力将一直存在,因此当第二次创建Leaf实例时无需再次对Leaf类进行初始化。

普通初始化块和构造器的执行顺序与前面介绍的一致。

静态初始化块和声明静态成员变量时所指定的初始化值都是该类的初始化代码,它们的执行顺序与源代码中的排序顺序相同。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值