近来在学习JAVA,一直在看《Thinking in java》这本书,有道练习题不会,特来请教各位。。
    题目是这样的:创建一个名为ConnectionManager的类。该类管理一个Connection对象的固定数组。客户端程序员不能够直接创建Connection对象,而只能通过ConnectionManager中的某个static方法来获取它们。当ConnectionManager之中不再有对象时,它会返回null引用。在main()之中检测这些类。
    在CSDN找了下有这么个代码,如下:
    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[] args) {
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);//cm.howManyLeft与howManyLeft有什么区别?
}   
} 想请问的是:
1、main()中标志的cm.getConnection()这个不会再次打印Connection()是因为getConnection()这个定义成了static,不再初始化了吗?
2、此时main()中的cm.howManyLeft与howManyLeft有什么区别?
3、初始化数组Connection[] ca时的for循环里的条件Connection x : ca是什么意思?用法是怎样的?

解决方案 »

  1.   

    for(Connection x : ca)这是JDK1.5加入的增强for循环 ,等价于
    for(int i;i< ca.length;i++){System.out.print(ca[i]);} 
      

  2.   

    先感谢楼上的;
    按照这样说法,那对x赋值又是什么意思呢?这段意思不是对ca[3]这个数组初始化吗?
    或许说这里对x操作实际就是对ca[]初始化?
    我能不能这样理解:
         for(int i=0; i < ca.length; i++)
           ca[i] = Connection.makeConnection(); 
      

  3.   

    for(Connection x : ca)//这个表达式是什么意思? 
    等价于:
    for(int i=0;i<ca.length;i++){
     Connection x = ca[i];cm.getConnection();//第一个不清楚的地方 
    调用 ConnectionManager 的 getConnection()方法来获取一个连接,因为ConnectionManager 里面定义了
    static int howManyLeft = 3; 就是说,这个连接池剩余的可用连接数。而每次getConnection的时候,都会return ca[--howManyLeft]; 就是说,每拿走一个连接,剩余连接数就会减1。//cm.howManyLeft与howManyLeft有什么区别? 
    你另外新建一个类,把main方法拷过去,然后再运行,你就会发现howManyLeft不能编译通过,因为它引用的是ConnectionManager 内部静态变量,就是说,只有main在ConnectionManager 内部时,才可以System.out.println(howManyLeft);而如果另外建一个类,就要用cm.howManyLeft或者ConnectionManager.howManyLeft了。这个问题不知道回答的对不对,等高手指正吧。
      

  4.   

    先谢谢楼上的.
    我好像感觉问题越来越多了
        for(Connection x : ca) 
         x = Connection.makeConnection(); 
    起初我认为这段代码是用来初始化ca[]数列的,现在若是等价于
    for(int i=0;i <ca.length;i++){ 
      Connection x = ca[i]; 
    }
    那么定义个x的对象在这段代码中是作何用?此时的ca[i]应该还没有存放有Connection的对象是吧?对于static Connection[] ca = new Connection[3];
    Connection的构造器已经是private的,Connection cnn = new Connection()这样的语句已经是行不通了,那对于数组Connection[] ca = new Connection[3]这个为什么又可以这样使用的? cm.getConnection()可能我写的不是很清楚,我意思是
    ConnectionManager cm = new ConnectionManager(); 
    这段代码输出了3次的Connection(),那当使用cm.getConnection()时不会再次输出这3个Connection()是不是因为getConnection()定义成了static了.因此只初始化一次,所以才不会再出现3次的Connection()?howManyLeft我有点把它当全局变量看了...但是Java又没有全局变量~~~
      

  5.   

    (1) static Connection[] ca = new Connection[3]; 
        for(Connection x : ca)//这个表达式是什么意思?
           x = Connection.makeConnection();     这个叫for-each语法现象,是JDK5.0的新特征。上面的语句相当于:
        for(int i=0;i<ca.size();i++)
            ca[i]=Connection.makeConnection();
        所以三楼的"等价于"是不正确的。(2) static Connection[] ca = new Connection[3]; 的问题    数组也是对象,ca创建的是一个Connection[]的数组对象,而并没有创建Connection类对象。所以这里并没有调用Connection的私有构造器。ca[0,1,2]全部指向的是null,而没有指向实际的Connection对象。(3) cm.getConnection()的问题    {
    for(Connection x : ca)//这个表达式是什么意思?
    x = Connection.makeConnection();
        }
        上面一段语句是ConnectionManager的初始化块,每一次创建一个新的ConnectionManager对象是调用一次。但main中你只创建了一个ConnectionManager对象cm,故只执行一次初始化块。三次调用了cm的getConnection()方法时是不会执行初始化块的。
      

  6.   

    1、main()中标志的cm.getConnection()这个不会再次打印Connection()是因为getConnection()这个定义成了static,不再初始化了吗? 
    第一次调用cm.getConnection()的时候,在它之前static 先执行了
    static Connection[] ca = new Connection[3]; { 
    for(Connection x : ca)//这个表达式是什么意思? 
    x = Connection.makeConnection(); 

    遍历了三次,也就是创建了三个Connection(),它初始化之后现在的howManyLeft当然是三了,调用System.out.println(howManyLeft)输出3 2 1 
    第二次调用cm.getConnection(); 现在的howManyLeft是0所以输出No more connections
    同时返回空
    第三次调用cm.getConnection();没有意义已经是空了,输出也是空。
    输出howManyLeft当然是0了2、此时main()中的cm.howManyLeft与howManyLeft有什么区别?
    没有区别,两个其实就是一个,都一样。静态全局变量。区别在你写发不同3、初始化数组Connection[] ca时的for循环里的条件Connection x : ca是什么意思?用法是怎样的?
    1.5之后的新特性,遍历数组和集合用。另外说句题外话,初学者不要看Thinking in java 
      

  7.   

    基本同意楼上的解释。
    第2个疑问,简单的说是cm.howManyLeft与howManyLeft其实都是引用的累ConnectionManager的静态变量howManyLeft。
      

  8.   

    其实我认为并不是初学者不适合看《Thinking in Java》  而是不适合看中文版《Thinking in Java》。在有些解释上翻译者是无法了解作者当时编写的感觉的。所以才会有很模糊的感觉。我个人看了Core Java  2遍的,但是这本书总体来说不是特别的详细。