初始化块:

初始化块示例代码:

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(); } }
原文地址:https://www.cnblogs.com/baby-zhude/p/8046160.html