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 回复毕小宝: 是因为已经创建了,所以不再创建了么?
大约 2 年之前 回复
qq_25827845
qq_25827845 回复毕小宝: 又看了一遍,先打印了三次Connection()我懂了,可是,在主函数里,会打印剩余个数,之后调用.getConnection();方法,会return一个ca[2],ca[1],这不是会重新new一个Connection()对象么?为什么不会再次打印构造函数里得“Connection()”?求指点,谢谢
大约 2 年之前 回复
zyf4005
zyf4005 回复毕小宝: 代码最后的那三个cm.getConnection(); return ca[--howManyLeft] ca[2].ca[1],ca[0]这三个数组元素是不是指的是三个new Connection(),没有明确的具体值,所以cm.getConnection();也没有具体的输出。对吗?
大约 2 年之前 回复
wojiushiwo945you
wojiushiwo945you 回复zyf4005: 呵呵,你过奖了啊。这是Java基础呢,但凡熟悉Java语言的都应该了解的知识。
大约 2 年之前 回复
zyf4005
zyf4005 牛逼啊,分析的很到位
大约 2 年之前 回复
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 编译错误?
大约 2 年之前 回复
qq_25827845
qq_25827845 你好,输出结果为:Connection() Connection() Connection() 3 2 1 No more connections null 0
大约 2 年之前 回复
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: 多谢拔刀相助
大约 2 年之前 回复
zyf4005
zyf4005 给你推荐点文章看看,讲的不错。http://www.cnblogs.com/alexlo/archive/2013/03/05/2944573.html
大约 2 年之前 回复
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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
字符串比较之object.ReferenceEquals方法
Code: using System; using System.Text; namespace CsDev { class Class3 { static void Main() { string a = "avd"; string b = "av"; string c
同一空间如果放多个asp.net网站,防止App_Code.dll冲突?
最近要测试一个网站,发现发布后的文件中也有App_Code.dll 致使和asp.net空间原有网站冲突, 解决来决绝去还是不行,最后没辙我是这么干的。 把所偶App code目录的类都单独拿出来,见一个Class项目,统一编译成一个dll,起名 XXX.dll, 然后用网站引用这个XXX.dll,然后就没有App_code.dll了,避免了冲突。 如今一个空间我放了四个网站项目,虽然只能
下面这段代码要循环延时输出0 1 2 3 4,输出结果是否正确,若不正确请修改,并理
for(var i=0;i {        setTimeout(function()        {               document.write(i + " ");        },100); } 以上代码输出:5,5,5,5,5 修改如下: for(vari=0;i {        (function(i){               setTi
5-3 出租 (20分)
下面是新浪微博上曾经很火的一张图:一时间网上一片求救声,急问这个怎么破。其实这段代码很简单,index数组就是arr数组的下标,index[0]=2 对应 arr[2]=1,index[1]=0 对应 arr[0]=8,index[2]=3 对应 arr[3]=0,以此类推…… 很容易得到电话号码是18013820100。本题要求你编写一个程序,为任何一个电话号码生成这段代码 —— 事实上,只要生成
C#笔试题(二)
一、问答题 61.下面这段代码输出什么?为什么? 答案注释: int i=5;  int j=5;  if (Object.ReferenceEquals(i,j))  Console.WriteLine("Equal");  else  Console.WriteLine("Not Equal");  不相等,因为比较的是对像 62.什么叫做SQL注入,如何防止?请举例说明。
Java - PAT - L1-027. 出租(天梯赛决赛题目)
下面是新浪微博上曾经很火的一张图: 一时间网上一片求救声,急问这个怎么破。其实这段代码很简单,index数组就是arr数组的下标,index[0]=2 对应 arr[2]=1,index[1]=0 对应 arr[0]=8,index[2]=3 对应 arr[3]=0,以此类推…… 很容易得到电话号码是18013820100。 本题要求你编写一个程序,为任何一个电话号码生成这
编写一段代码,其功能是打印代码本身
编写一段代码,其功能是打印代码本身#includemain(){char *c="#include%cmain()%c{%cchar *c=%c%s%c;%cprintf(c,10,10,10,34,c,34,10,10);%c}";printf(c,10,10,10,34,c,34,10,10);}以上代码来自:编写一段代码,其功能是打印代码本身。该代码将自身编为单行的字符串然后打印,并使用AS
7-3 出租(20 分)
7-3 出租(20 分) 下面是新浪微博上曾经很火的一张图: 一时间网上一片求救声,急问这个怎么破。其实这段代码很简单,index数组就是arr数组的下标,index[0]=2 对应 arr[2]=1,index[1]=0 对应 arr[0]=8,index[2]=3 对应 arr[3]=0,以此类推…… 很容易得到电话号码是18013820100。 本题要求你编写一个程
腾讯 2016 春招笔试(伪)权威解析
这篇文章的原文在:原文地址 1、应用程序开发过程中,下面哪些开发习惯可能导致安全漏洞? 在程序代码中打印日志输出敏感信息方便测试(√) 在使用数组前判断是否越界 在生成随机数前使用当前时间设置随机数种子(√) 设置配置文件权限为rw-rw-rw-(√) 只说一下第三个吧,给出篇文章随机数是骗人的 这篇文章中提到的另一篇文章我也给出链接,省去大家查找的时间当随机不够随机:一个在线扑克游戏...
C/C++经典题解析
以下题目都是来时何海涛博客的 C/C++/C#面试题精选 系列,感谢博主的整理。这些题不仅帮助我通过一些笔试,更重要的是帮助我很好的理解C/C++。以前很讨厌这些题,现在想来做些题还是很有用的,至少可以帮助你巩固知识加深理解。 为支持博主的原创,我附上文章的连接地址 点击打开链接。 在阅读中发现博主解释的还不够详细,为了能够更好的帮助网友,同时也帮助自己梳理一下知识,我重新整理了一下。