2 zyf4005 zyf4005 于 2016.05.02 11:22 提问

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);

}                   
} 

5个回答

wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.05.02 13:26
已采纳
  因为你的main方法还没调用的时候,类加载的时候已经执行了静态代码块,完成了三次创建对象的操作即连续调用了三次new Connection()操作,所以先打印了三次Connection()。然后执行main方法的时候,你又依次打印System.out.println(howManyLeft);打印剩余的connection个数。你可以注释掉ConnectionManager cm = new ConnectionManager();以后的代码,就可以看到静态代码的执行是加载类的时候,也会打印三次Connection()字符串的。
qq_25827845
qq_25827845 回复毕小宝: 是因为已经创建了,所以不再创建了么?
一年多之前 回复
qq_25827845
qq_25827845 回复毕小宝: 又看了一遍,先打印了三次Connection()我懂了,可是,在主函数里,会打印剩余个数,之后调用.getConnection();方法,会return一个ca[2],ca[1],这不是会重新new一个Connection()对象么?为什么不会再次打印构造函数里得“Connection()”?求指点,谢谢
一年多之前 回复
zyf4005
zyf4005 回复毕小宝: 代码最后的那三个cm.getConnection(); return ca[--howManyLeft] ca[2].ca[1],ca[0]这三个数组元素是不是指的是三个new Connection(),没有明确的具体值,所以cm.getConnection();也没有具体的输出。对吗?
一年多之前 回复
wojiushiwo945you
wojiushiwo945you 回复zyf4005: 呵呵,你过奖了啊。这是Java基础呢,但凡熟悉Java语言的都应该了解的知识。
一年多之前 回复
zyf4005
zyf4005 牛逼啊,分析的很到位
一年多之前 回复
CSDNXIAON
CSDNXIAON   2016.05.02 11:31

理解并发的第一步就是下面这段代码
----------------------同志你好,我是CSDN问答机器人小N,奉组织之命为你提供参考答案,编程尚未成功,同志仍需努力!

wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.05.02 11:59
static Connection[] ca = new Connection[3]; 
{
for(Connection x : ca)   这个非静态代码块怎么理解?
    x = Connection.makeConnection();
}

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

zyf4005
zyf4005 编译错误?
一年多之前 回复
qq_25827845
qq_25827845 你好,输出结果为:Connection() Connection() Connection() 3 2 1 No more connections null 0
一年多之前 回复
qq_25827845
qq_25827845   2016.05.02 13:02

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

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

qq_25827845
qq_25827845 回复zyf4005: 多谢拔刀相助
一年多之前 回复
zyf4005
zyf4005 给你推荐点文章看看,讲的不错。http://www.cnblogs.com/alexlo/archive/2013/03/05/2944573.html
一年多之前 回复
havedream_one
havedream_one   2016.05.02 17:00

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

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!