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