java中下面这段代码怎么理解?

class Connection {
private static int count = 0;
private int i = 0;
private Connection() { System.out.println("Connection()");}
// Allow creation via static method:
static Connection makeConnection() {
    count++;
    return new Connection();
}
public static int howMany() { return count; } 
public String toString() {
    return ("Connection " + count);
}
}

public class ConnectionManager {
static int howManyLeft = 3;
static Connection[] ca = new Connection[3]; 
{
for(Connection x : ca)   这个非静态代码块怎么理解?
    x = Connection.makeConnection();
}
public static Connection getConnection() {
    if(howManyLeft > 0)
        return ca[--howManyLeft];
    else {
        System.out.println("No more connections");
        return null;
    }
}
public static void main(String[] agrs) {        
    ConnectionManager cm = new ConnectionManager();
    System.out.println(cm.howManyLeft);
    cm.getConnection();
    System.out.println(howManyLeft);
    cm.getConnection();
    System.out.println(howManyLeft);
    cm.getConnection();
    System.out.println(cm.getConnection());
    System.out.println(howManyLeft);

}                   
} 
  因为你的main方法还没调用的时候,类加载的时候已经执行了静态代码块,完成了三次创建对象的操作即连续调用了三次new Connection()操作,所以先打印了三次Connection()。然后执行main方法的时候,你又依次打印System.out.println(howManyLeft);打印剩余的connection个数。你可以注释掉ConnectionManager cm = new ConnectionManager();以后的代码,就可以看到静态代码的执行是加载类的时候,也会打印三次Connection()字符串的。
static Connection[] ca = new Connection[3]; 
{
for(Connection x : ca)   这个非静态代码块怎么理解?
    x = Connection.makeConnection();
}

这段代码其实就是在对这个数组中的每个元素赋值。声明了一个数组变量,数组元素的类型是Connection。而且你这段代码应该有编译错误吧,非静态代码块中应该不能访问静态成员变量的。

输出结果为:
Connection()
Connection()
Connection()
3
2
1
No more connections
null
0

为什么结果不是:
3
Connection()
2
Connection()
1
Connection()
No more connections
null
0
求大神指点12.

x = Connection.makeConnection();//没调用一次就打印一次Connection()
ConnectionManager cm = new ConnectionManager(); //输出 三个Connection()
System.out.println(cm.howManyLeft);//3
cm.getConnection();//count = 2
System.out.println(howManyLeft);//2
cm.getConnection();//count = 1
System.out.println(howManyLeft);//1
cm.getConnection();//count = 0
System.out.println(cm.getConnection());//null
System.out.println(howManyLeft);//0