构造器无法阻止自动初始化的运行,它将在构造器被调用之前发生.

class Counter{
  int i;
  Counter(){i = 7;}
 }


 i首先会被置0,然后变成7.对于所有基本类型和对象引用,包括在定义时已经指定初值的变量,这种情况都是成立的.因此编译器不会强制你一定要在构造器中or在使用它们之前对元素进行初始化.
初始化顺序:在类的内部,变量定义的先后顺序决定了初始化的顺序.即使变量定义散布于方法定义之间,它们仍旧会在任何方法(包括构造器)被调用之前得到初始化.
静态数据的初始化:情况并无不同.注意:只有在第一个对象被创建(或第一次访问静态数据)的时候,静态对象才会被初始化.此后,静态对象不会再次被初始化.
初始化的顺序是,先"静态"对象(如果它们尚未因前面的对象创建过程而被初始化),而后是"非静态"对象,再执行构造器(此时可能会牵涉到很多动作,尤其是涉及继承的时候).

 




java 初始化静态 map java静态初始化失败_java 初始化静态 map

java 初始化静态 map java静态初始化失败_java_02

class 
   Bowl 
  ... 
  {
    Bowl(int marker)...{
        System.out.println("Bowl(" + marker + ")");
    }
    void f(int marker)...{
        System.out.println("f(" + marker + ")");
    }
} 
  

 
  class 
   Table 
  ... 
  {
    static Bowl b1 = new Bowl(1);
    Table()...{
        System.out.println("Table()");
        b2.f(1);
    }
    void f2(int marker)...{
        System.out.println("f2(" + marker + ")");
    }
    static Bowl b2 = new Bowl(2);
} 
  

 
  class 
   Cupboard 
  ... 
  {
    Bowl b3 = new Bowl(3);
    static Bowl b4 = new Bowl(4);
    Cupboard()...{
        System.out.println("Cupboard()");
        b4.f(2);
    }
    void f3(int marker)...{
        System.out.println("f3(" + marker + ")");
    }
    static Bowl b5 = new Bowl(5);
} 
  
 
  /**/ 
  /*Cupboard类执行顺序:1.static成员,2.非static变量or对象实例化的初始化,3.其它(看运行结果可理解)*/ 
  

 
  class 
   StaticInitialization 
  ... 
  {
    public static void main(String[] args)...{
        System.out.println("Creating new Cupboard() in main");
        new Cupboard();
        System.out.println("Creating new Cupboard() in main");
        new Cupboard();
        t2.f2(1);
        t3.f3(1);
    }
    static Table t2 = new Table();
    static Cupboard t3 = new Cupboard();
}


Java允许将多个静态初始化动作组织成一个特殊的"静态块".与其他静态初始化动作一样,当类被装载时,"静态块"执行,且这段代码仅执行一次.
当一个程序中用到了其他的类,类是在第一次被使用的时候才被装载,而不是在程序启动时就装载程序中所有可能用到的类.
无论是执行(1)代码访问静态的c1对象还是(2)代码访问静态的c1对象,Cups的静态初始化动作都会得到执行(标号(2)中代码激活一行or两行代码都无关紧要,因为静态初始化动作只进行一次). 
Java中也有类似语法,用来初始化每一个对象的非静态变量(只需要将"静态块"前的static去掉就ok了).

 



java 初始化静态 map java静态初始化失败_java 初始化静态 map

java 初始化静态 map java静态初始化失败_java_02

class    Cup 
  ... 
  {
    Cup(int marker)...{
        System.out.println("Cup(" + marker + ");");
    }
    void f(int marker)...{
        System.out.println("f(" + marker + ");");
    }
}   
   class 
   Cups 
  ... 
  {
    static Cup c1;
    static Cup c2;
    static...{
        c1 = new Cup(1);
        c2 = new Cup(2);
        System.out.println("static code block");
    }
    Cups()...{
        System.out.println("Cups");
    }
}   
   class 
   ExplicitStatic 
  ... 
  {
    public static void main(String[] args)...{
        System.out.println("Inside main()");
        //Cups.c1.f(99);    (1)
    }
    //static Cups x = new Cups();    (2)
    //static Cups y = new Cups();
}