`
dandy
  • 浏览: 67239 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

猫变成了狗

    博客分类:
  • java
阅读更多
出自《java puzzle》

下面的程序使用了一个Counter类来跟踪每一种家庭宠物叫唤的次数。那么该程序会打印出什么呢?
class Counter {
 private static int count = 0;
 public static final synchronized void increment() {
  count++;
 }
 public static final synchronized int getCount() {
  return count;
 }
}
class Dog extends Counter {
 public Dog() { }
 public void woof() { increment(); }
 }
class Cat extends Counter {
 public Cat() { }
 public void meow() { increment(); }
 }
public class Ruckus {
 public static void main(String[] args) {
  Dog dogs[] = { new Dog(), new Dog() };
  for (int i = 0; i < dogs.length; i++)
   dogs[i].woof();
  Cat cats[] = { new Cat(), new Cat(), new Cat() };
  for (int i = 0; i < cats.length; i++)
   cats[i].meow();
  System.out.print(Dog.getCount() + " woofs and ");
  System.out.println(Cat.getCount() + " meows");
 }
}

我们听到两声狗叫和三声猫叫——肯定是好一阵喧闹——因此,程序应该打印2 woofs and 3 meows,不是吗?不:它打印的是5 woofs and 5 meows。所有这些多出来的吵闹声是从哪里来的?我们做些什么才能够阻止它?
该程序打印出的犬吠声和猫叫声的数量之和是10,它是实际总数的两倍。问题在于Dog和Cat都从其共同的超类那里继承了count域,而count又是一个静态域。每一个静态域在声明它的类及其所有子类中共享一份单一的拷贝,因此Dog和Cat使用的是相同的count域。每一个对woof或meow的调用都在递增这个域,因此它被递增了5次。该程序分别通过调用Dog.getCount和Cat.getCount读取了这个域两次,在每一次读取时,都返回并打印了5。
在设计一个类的时候,如果该类构建于另一个类的行为之上,那么你有两种选择:一种是继承,即一个类扩展另一个类;另一种是组合,即在一个类中包含另一个类的一个实例。选择的依据是,一个类的每一个实例都是另一个类的一个实例,还是都有另一个类的一个实例。在第一种情况应该使用继承,而第二种情况应该使用组合。当你拿不准时,优选组合而不是继承[EJ Item 14]。
一条狗或是一只猫都不是一种计数器,因此使用继承是错误的。Dog和Cat不应该扩展Counter,而是应该都包含一个计数器域。每一种宠物都需要有一个计数器,但并非每一只宠物都需要有一个计数器,因此,这些计数器域应该是静态的。我们不必为Counter类而感到烦恼;一个int域就足够了。
下面是我们重新设计过的程序,它会打印出我们所期望的2 woofs, 3 meows:
class Dog {
private static int woofCounter;
public Dog() { }
public static int woofCount() { return woofCounter; };
public void woof() { woofCounter++; }
}
class Cat {
private static int meowCounter;
public Cat() { }
public static int meowCount() { return meowCounter; };
public void meow() { meowCounter++; }
}


Ruckus类除了两行语句之外没有其它的变化,这两行语句被修改为使用新的方法名来访问计数器:
System.out.print(Dog.woofCount() + " woofs and ");
System.out.println(Cat.meowCount() + " meows");
总之,静态域由声明它的类及其所有子类所共享。如果你需要让每一个子类都具有某个域的单独拷贝,那么你必须在每一个子类中声明一个单独的静态域。如果每一个实例都需要一个单独的拷贝,那么你可以在基类中声明一个非静态域。还有就是,要优选组合而不是继承,除非导出类真的需要被当作是某一种基类来看待。
2
0
分享到:
评论

相关推荐

    直播电商三国杀,从“猫拼狗”到“猫快抖”(新零售行业)-招商证券-2020.3-50页.pdf

    直播电商的流行,实际上是对人货场(消费者、商品、购买场景)效率匹配的优化,它改变了传统电商的销售模式,将主动消费变成了被动消费,使得消费者可以实时互动,增强了购物体验,同时也可以促进销售转化。...

    NOC编程猫创新编程大赛筛选考试模拟测试题附答案

    相传,古人根据十二生肖中的动物的出没时间来命名各个时辰,对应着“十二生肖中的子(鼠)、丑(牛)、寅(虎)、卯(兔)、辰(龙)、巳(蛇)、午(马)、未(羊)、申(猴)、酉(鸡)、戌(狗)、亥(猪)”。...

    第一期(小学组)NOC编程猫创新编程赛题(单选)模拟测试题附答案

    相传,古人根据十二生肖中的动物的出没时间来命名各个时辰,对应着“十二生肖中的子(鼠)、丑(牛)、寅(虎)、卯(兔)、辰(龙)、巳(蛇)、”午(马)、未(羊)、申(猴)、酉(鸡)、戌(狗)、亥(猪)。...

    爱狗爱猫人士网站模板

    宠物爱好者网站模板是一种专为喜爱狗和猫的人群设计的网页模板,旨在提供一个互动、信息丰富的在线平台,让人们能够分享养宠经验、获取宠物护理知识、参与社区活动以及寻找宠物相关服务。以下是对这个“爱狗爱猫人士...

    微软面试智力题 .....................

    比如,“如果有一个按钮,按下后可以将全世界的猫变成狗,你会按吗?为什么?”这个问题可能是在看你的价值观和对后果的预见性。 6. **快速计算**:面试官可能会给你一些简单的数学计算,要求快速得出答案,以此...

    Java解惑(谜题)CHM中英文双版本

    我的猫变成狗了 谜题48:我所得到的都是静态的 谜题49:比生命更大 谜题50:不是你的类型 谜题51:那个点是什么? 谜题52:合计数的玩笑 谜题53:按你的意愿行事 谜题54:Null与Void 谜题55:特创论 Java...

    基于php后台的小程序宠物商城设计与实现+毕业论文

    1.前台 首页、全部商品(或分类)、购物车、个人中心 ...3.能够查看商品详情,具有客服沟通功能 4.具有搜索功能和支付功能,下单功能,能够...6分类:主要是对猫粮狗粮,猫狗宠物,医药的商品分类(或者变成全部商品,)

    STM32之DAC君

    如花说得好:呃呃呃、是俗话说得好:有了ADC,怎可少了DAC、、我觉得奇怪、今天我开头就直奔主题了、我想了想,总结了一句话:孙悟空纵然有七十二变、无论是变成猫也好,变成狗也罢、始终还是会变回他本身、所以我...

    幼儿手指操大全精编版.docx

    - “小狗小狗汪汪汪”:双手大拇指放在太阳穴位置,其余四指并拢,做小狗的表情。 - “螃蟹螃蟹爬爬爬”:双手五指伸开,放在身体两侧,模仿螃蟹走路的样子。 #### 五、《我有一双小小手》(大班) 通过丰富的...

    巴都、妞妞和垃圾狗读后感 .docx

    - **生活体验与成长**:妞妞在变成猫咪期间所经历的一系列事件,让她深刻体会到了生活的不易,最终促使她回归正常生活,并且更加珍惜与家人共度的时光以及学习的机会。 综上所述,这些故事和读书笔记不仅提供了有趣...

    三年级上册数学应用题解答问题训练经典题目50 (2).doc

    一个细菌每分钟变成3个,3分钟后,细菌数量是3的3次方。 20. 题目20需要根据年龄的比例关系推断王老师和小明的年龄。 21. 题目21是关于人数的倍数关系问题,通过建立方程找出男生和女生的人数。 22. 题目22是关于...

    一年级下册《道德与法治》知识点复习材料.pdf

    * 大自然的礼物:稻谷变成香甜的米饭、春蚕吐出的丝织成漂亮的丝绸等 * 人们在大自然中的角色:种植、采收、劳作等 * 感受到快乐:在大自然里,我们感受到很多快乐 五、家庭和人际关系 * 家庭成员的称呼:姨妈、...

    一年级语文下册期末考试题-一年级语文下册期末考试卷..doc

    例如:"忘" 可以变成 "望"(望去),"吗" 可以变成 "妈"(妈妈),"跳" 可以变成 "挑"(挑选),"跟" 可以变成 "很"(很多),"是" 可以变成 "事"(事情),"红" 可以变成 "工"(工作),"活" 可以变成 "话"(说话),"队...

    最新三年级上册数学应用题解答问题试题(含答案)(6).doc

    由于3变成8增加了5,5变成2减少了3,所以正确结果应为xy-10a+3-2b。 4. 要求16个女同学住旅店,有双人间和三人间。可以列出所有可能的组合,如1个三人间和5个双人间,或3个三人间和2个双人间等,直到找到满足条件的...

    2020春三年级英语下册Unit1Pets同步练习4剑桥版20200512344

    这有助于他们记忆和识别不同的宠物种类,包括dog(狗)、cat(猫)、mouse(鼠标)、bird(鸟)、frog(青蛙)和fish(鱼)。 第二部分是单词拼写,这个环节锻炼学生的字母顺序和单词拼读能力。题目要求学生按照...

    三年级上册英语一课一练Module4Unit2Exercise4牛津上海版学习.pdf

    例如,"dog"(狗)变成复数形式"dogs","hen"(母鸡)变成"hen","duck"(鸭子)变成"ducks","cat"(猫)变成"cats",而"chick"(小鸡)变成"chicks"。这些变化是英语基础语法的一部分,需要学生掌握。 2. 阅读...

    一年级语文下册期末考试题-一年级语文下册期末考试卷 .doc

    3. **字形变换**:考察学生的字形转换能力,如将“忘”变成“忙”,组词为“忙碌”;“吗”变成“妈”,组词为“妈妈”;“跳”变成“挑”,组词为“挑选”;“跟”变成“根”,组词为“根本”;“是”变成“事”,...

    四年级英语下册Unit4AtthefarmPartB第2课时作业人教PEP版20200410237

    2. **图片匹配**:这部分练习要求学生根据图片选择正确的英文单词,比如识别cow(奶牛)与cat(猫)、dog(狗)与hen(母鸡),horse(马)与duck(鸭子),以及sheep(绵羊)与goat(山羊)的区别。这不仅测试了...

    一年级语文下册期末考试题-一年级语文下册期末考试卷..docx

    例如,“忘”的偏旁换成“女”,可以变成“娘”,组词为“姑娘”;“吗”的偏旁换成“口”,可以变成“吗啡”,组词为“吗啡针”;“跳”的偏旁换成“氵”,可以变成“挑”,组词为“挑选”;“跟”的偏旁换成“木”...

    部编版二年级上册语文期中考试题(及答案).pdf

    - 天上的白云一会儿变成绵羊,一会儿变成骏马,一会儿变成小猫。 8. 课文理解: - 短文《送给你们一个冬天》讲述了春天来临时,小动物们为了给冬眠结束后的小伙伴们一个惊喜,模拟冬天的景象,如小白兔装扮圣诞树...

Global site tag (gtag.js) - Google Analytics