1 类初始化时必须显式调用,用new进行显示调用进行初始化(前提条件)。


2 类初始化时其中的先后顺序:


2.1  static修饰的


        2.1.1 先初始化类中的所有的static修饰的成员变量或者代码块。


        2.1.2 初始化static修饰的成员变量和代码块时,根据从上到下的顺序按照顺序初始化。


        2.1.3 初始化static修饰的成员变量时,会对其进行进行默认赋值。基本类型就按照基本类型初始化时的默认值进行赋值。引用类型都是null。


    2.2 无static修饰的


        2.2.1  根据从上到下的顺序 初始类中所有的化成员变量或者一般的代码块。


        2.2.2 初始化成员变量或者一般代码块中的变量时,会对其进行默认赋值。 基本类型就按照基本类型初始化时的默认值进行赋值。引用类型都是null。


    2.3 构造方法


        2.3.1 类中的所有成员变量或者代码块初始化后,才会调用构造方法


3. 类初始化时,类中的静态成员变量或者静态代码块都是会初始化一次。以后再次初始化时,就不会被初始化了。

4.当子类存在父类时,先初始化父类中的static数据,然后初始化子类中的static数据。然后初始化父类的普通数据,然后初始化子类的普通数据,然后执行父类构造方法,最后执行子类构造方法

例:

class Bowl{
Bowl(int type){
System.out.println(" 构造方法 class Bowl,被调用的是bowl("+type+")");
}
  }
  class  Table{
Bowl bowl4 = new Bowl(4);
static Bowl  bowl1= new Bowl(1);
static{
Bowl Bowl3 =  new Bowl(3);
}
static Bowl  bowl2= new Bowl(2);
{
Bowl bowl =  new Bowl(6);
}
Bowl bowl5 = new Bowl(5);
 
Table(){
System.out.println(" 构造方法 class Table");
}
  }
 public class testStaticInitalzation1 {
public static void main(String[] args) {
System.out.println("Table1");
new Table();

System.out.println("Table2");
new Table();
}
 }

运行结果:

Table1
 构造方法 class Bowl,被调用的是bowl(1)
 构造方法 class Bowl,被调用的是bowl(3)
 构造方法 class Bowl,被调用的是bowl(2)
 构造方法 class Bowl,被调用的是bowl(4)
 构造方法 class Bowl,被调用的是bowl(6)
 构造方法 class Bowl,被调用的是bowl(5)
 构造方法 class Table
Table2
 构造方法 class Bowl,被调用的是bowl(4)
 构造方法 class Bowl,被调用的是bowl(6)
 构造方法 class Bowl,被调用的是bowl(5)
 构造方法 class Table


在该段代码中,有三个类,分别是Bowl,Table,testStaticInitalzation1。bowl是一个只有一个构造方法的类。Table类中,有三个静态成员变量,三个普通成员变量。其中有静态成员变量、静态代码块、成员变量和普通代码块。其中顺序已经被打乱。

类Table显式被初始化(new Table()),其中的首先初始化的就是静态成员变量和静态代码块。则按照上面的介绍,按照bowl1、bowl3、bowl2的顺序初始化。在初始化时,这三个静态成员变量被指定初始化,则类Bowl被初始化,类Bowl初始化时,会调用构造方法,返回一个类Bowl的对象引用赋值给bowl1、bowl3、bowl2。类Table中的静态成员变量和静态代码块初始化完成。然后按照这样的顺序初始化类中的成员变量和普通代码块并对其赋值。最后调用构造方法。

在main方法中,第二次对类Table进行初始化,是因为类中的静态数据只会在table对象被创建时初始化,静态数据不会再次被初始化。