初始化块:
初始化块示例代码:
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(); } }
热心技术,并兼吃喝,偶谈风月,不言国事.