近来在学习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是什么意思?用法是怎样的?
题目是这样的:创建一个名为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是什么意思?用法是怎样的?
for(int i;i< ca.length;i++){System.out.print(ca[i]);}
按照这样说法,那对x赋值又是什么意思呢?这段意思不是对ca[3]这个数组初始化吗?
或许说这里对x操作实际就是对ca[]初始化?
我能不能这样理解:
for(int i=0; i < ca.length; i++)
ca[i] = Connection.makeConnection();
等价于:
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了。这个问题不知道回答的对不对,等高手指正吧。
我好像感觉问题越来越多了
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又没有全局变量~~~
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()方法时是不会执行初始化块的。
第一次调用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
第2个疑问,简单的说是cm.howManyLeft与howManyLeft其实都是引用的累ConnectionManager的静态变量howManyLeft。