java设计狗叫和狗咬_Java类谜题47:啊呀!我的猫变成狗了
面的程序使用了一个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++; }
Java类谜题47:啊呀!我的猫变成狗了.doc
下载Word文档到电脑,方便收藏和打印[全文共1363字]
编辑推荐:
下载Word文档
java设计狗叫和狗咬_Java类谜题47:啊呀!我的猫变成狗了相关推荐
- 用java设计实现一个简单的动作冒险类游戏
用java设计实现一个简单的动作冒险类游戏 1.背景 这是java老师布置的本周作业,具体题目截图如下 2.分析 在UML图已经给出的前提下,此作业很容易.自己在此基础上,加了个简单的界面设计和玩家设 ...
- java设计游戏_用java设计实现一个简单的动作冒险类游戏
用java设计实现一个简单的动作冒险类游戏 1.背景 这是java老师布置的本周作业,具体题目截图如下 2.分析 在UML图已经给出的前提下,此作业很容易.自己在此基础上,加了个简单的界面设计和玩家设 ...
- java动作游戏教程_用java设计实现一个简单的动作冒险类游戏
用java设计实现一个简单的动作冒险类游戏 1.背景 这是java老师布置的本周作业,具体题目截图如下 2.分析 在UML图已经给出的前提下,此作业很容易.自己在此基础上,加了个简单的界面设计和玩家设 ...
- java设计一个程序后怎么测试_Java语言程序设计(第1阶段学习测试)(都平)
第 1 页 共 5 页 山东省过程性考试课程 Java 语言程序设计(第2阶段)测试 一. 简答题 (本大题共15个小题,每小题4分,共60分) 1. 什么是类?任何定义一个类?类中包含哪几部分,分别 ...
- Java猫和狗(继承,多态,抽象,接口版)上
Java的继承,抽象,多态,接口的简单应用. 我们利用,猫和狗都是动物类,然后猫会抓鱼,狗会看门的这些方法来简单应用一下继承,抽象,多态,接口. 简单思路就是 1.定义动物类 2.定义猫,狗类,让他们 ...
- java动物类问题_java笔记--动物:具体猫和狗以多态方式写出
例 动物:猫和狗; 1 在动物中类的下面写上 动物具有的两个属性, 1 名 2 重量; 2 一个空的构造方法是必须紧跟其后的.再来一个构造方法,里面继承父类和继承本类; 3 再把private的几个属 ...
- 一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题。编程解决猫狗鱼过河问题。
import java.util.ArrayList; import java.util.List; import java.util.Random;/*** 一位老农带着猫.狗.鱼过河,河边有一条船 ...
- 猫、狗与Java的多态
多态(Polymorphism)按字面的意思就是"多种状态".在面向对象语言中,接口的多种不同的实现方式即为多态.引用Charlie Calverts对多态的描述--多态性是允许你 ...
- java阿法狗国际象棋_阿法狗并不是真正的人工智能:3分钟让你彻底明白阿法狗如何下棋...
原标题:阿法狗并不是真正的人工智能:3分钟让你彻底明白阿法狗如何下棋 阿法狗很强大,它的强大是由于它的原理和算法,这是大家都知道的,但具体咋回事,可能很多人就说不上来了.那么,今天我就试试用最通俗易懂 ...
最新文章
- WebService系列(三)--创建自己的WebService
- 计算机启动完成后操作系统负责管理的是,终极:如果计算机启动后无法进入系统,旧驱动程序会教您如何处理...
- java参数传入泛型类型_Java泛型参数界定到任何一个类型的范围
- leetcode - 1223. 掷骰子模拟
- 使用HTTPS方式向git托管网站推送项目时输错用户名密码
- 一个高并发的测试websocket脚本
- PHP扩展迁移为PHP7扩展兼容性问题记录
- jackson的简单实用实例(json)
- 关于Oracle统计中关于操作系统的统计说明,oracle10个/11g的新特点 自动工作量资料档案库(AWR) 文平...
- mapbox/minemap 获取比例尺
- 波束成形技术原理解析
- 鸿蒙系统sp3什么意思,XP系统的那个SP3是什么意思?
- Vue+iView table分页勾选记忆功能
- 2017 多校训练第二场 HDU 6047 Maximum Sequence(贪心+优先队列)
- 杭电2036——改革春风吹满地
- sipML5实现语音信息服务
- NB-IoT和LoRa在电力无线专网中的应用
- 在腾讯云开通短信验证服务如何设置正确格式的签名和正文模板并完成群发消息测试
- C语言学习专栏(1):易忘点
- 打开“互联运输”新视野 oTMS获A+轮融资