初始化块:
初始化块示例代码:
import static java.lang.System.*;
class Person{
//-第一个初始化块:
{
int a=6;
if(a>4){
out.println("第一个初始化块01!");
}
out.println("第一个初始化块02!");
}
//-第二个初始化块:
{
out.println("第二个初始化块!");
}
//-本类无参数的构造器
public Person(){
out.println("无参数构造器!");
}
public static void main(String[] args){
Person p=new Person();
}
}
运行结果:

总结:
1、当创建Java对象时,系统总是先调用该类里定义的初始化块,按照定义的初始化块顺序,一个挨一个的执行
2、只在创建Java对象时隐式的执行,而且在执行构造器之前执行
3、创建多个初始化块没有意义,因为其总是在创建对象时隐式的、并且全部的执行,完全可以创建一个初始化块来包含进来,让程序简洁,可读性强。
初始化和构造器的相同和不同:
1、初始化块是一段固定执行的代码,不能接收任何参数和调用。
2、都是对Java对象执行初始化操作,但是执行顺序不同,代码如下:
public class InstanceInitTest{
//-定义一个初始化块
{
a=6;//-对于初始化块内的实例变量定义,默认类型是指定的类型
}
//-初始化块之外,重新定义实例变量,并重新赋值
int a=9;
public static void main(String[] args){
System.out.println(new InstanceInitTest().a);
}
}
运行结果:

总结:
1、当Java创建一个对象时,系统先为该对象的实例变量分配内存(前提一加载)
2、接着对这些变量执行初始化,顺序是:先初始化块内后构造器内
注意:不带static修饰的初始化块只是对对象进行初始化,而不是对类进行初始化,想要对类进行初始化,要用static进行修饰,变成静态初始化块
初始化块的本质:
1、实际上初始化块是一个假象
2、当编译完java文件后,把生成的.class文件反编译回来,查看反编译代码会发现,在Java类中定义的初始化块会消失
3、原先书写的初始化块中代码会被还原到每个构造器中,并位于构造器中代码的前面,针对上面代码类,反编译过来的代码如下:
import java.io.PrintStream;
class Person
{
public Person()
{
int i = 6;
if (i > 4) {
System.out.println("第一个初始化块01!");
}
System.out.println("第一个初始化块02!");
System.out.println("第二个初始化块!");
System.out.println("无参数构造器!");
}
public static void main(String[] paramArrayOfString)
{
Person localPerson = new Person();
}
}
热心技术,并兼吃喝,偶谈风月,不言国事.
浙公网安备 33010602011771号