一、实例说明
这是一个很有趣的例子,该例将实现两个类车子和飞机,然后设计出两个具有攻击性的战斗工具,坦克和战斗机。将坦克和战斗机赋予两个动作,移动和射击。本例用来加深对继承和接口等Java面向对象程序设计中非常重要的概念。本例的源代码见随书光盘\source\chapter3\ *.java。
二、基础知识点
本例主要用到了Java中接口的概念。
接口是一种标准、一些规范,只要符合这个接口所制定的标准和规范,那么产品就可以和别人同样符合这个接口的产品相互的沟通,因为大家都是使用同一个接口,所以在沟通上就变得很容易。
在Java中,接口是由一些常量和抽象方法所组成的,接口中也只能包含着两种东西,一个接口的声明和类的声明是一样的,只不过把class这个关键字换成了interface,使用的格式如下:
<限定词> interface <接口名称> [ extends <接口名称>s]
三、技术要点
假设已经设计好了车子和飞机这两个类,如果现在要设计坦克和战斗机,那么坦克继承车子这个类,而战斗机继承飞机类。在坦克的类中加上发射这个方法,而在战斗机类中也加上发射这个方法,不过坦克发射的是炮弹,而战斗机发射的是飞弹。
那 么如何在坦克和战斗机这两个类中加上这个方法呢?利用抽象方法,可以在车子和飞机的类中加上发射这个抽象方法。问题是,不是所有的车子和飞机都需要这个方 法。比如说跑车继承车子类,它并不需要发射这个方法,比如说货车继承飞机类,它也不需要发射这个方法,所以使用抽象方法不行。
还有一种思路是设计一个抽象类,把攻击性相关的方法全放在类里面,然后需要使用的类再去继承这个类就好了。但是Java语言有个限制,就是不能多重继承。坦克和战斗机已经分别继承了车子和飞机,它们也就没有办法再去继承另一个类了。
这个时候就需要使用接口这个机制来帮我们解决这个问题。设计一个名为武器的接口,里面声明了一个发射方法,想要拥有武器功能的交通工具,就必须去实现这个接口。这样一来,继承的归继承,实现接口的归实现接口,就不会有刚才的问题产生了。下面是武器这个接口的程序代码:
public interface Weapon
{
public void shoot();
}
有了接口以后,任何想拥有接口所定义的方法类,就必须去实现这个接口。继承类是用extends这个关键字,而实现接口就用implements这个关键字,下面看看坦克这个类的实现:
public class Tank extends Car implements Weapon
{
public Tank()
{
}
public void shoot()
{
System.out.println("发射大炮");
}
}
注意
实现接口的声明必须写在继承声明之后,而在类中必须去实现接口所定义的方法。如果没有实现一个接口,没有实现接口里面定义的全部方法,那么该类就是一个抽象类,必须要在类声明中加上abstract,否则Java在编译时就会产生错误信息。
四、实现步骤
在Jbulider9中新建一个类命名为Car.java,在Car.java文件中敲入下列代码:
//Car类代表车子,是坦克Tank的父类。
public class Car
{
public Car()
{
}
public void move(){
System.out.println("running");
}
}
在Jbulider9中新建一个类命名为Plane.java,在Plane.java中敲入下列代码:
//Plane类代表飞机,是战斗机Fighter的父类
public class Plane
{
public Plane()
{
}
public void move(){
System.out.println("flying");
}
}
在Jbulider9中新建一个类命名为Weapon.java,在Weapon.java中敲入下列代码:
//武器接口
public interface Weapon
{
public void shoot();
}
在Jbulider9中新建一个类命名为Tank.java,在Tank.java中敲入下列代码:
//坦克类,继承了Car类并使用了Weapon接口
public class Tank extends Car implements Weapon
{
public Tank()
{
}
public void shoot()
{
System.out.println("发射大炮");
}
}
在Jbulider9中新建一个类命名为Figher.java,在Fighter.java中敲入下列代码:
//战斗机类,继承了plane类并使用了Weapon接口
public class Fighter extends Plane implements Weapon
{
public Fighter()
{
}
public void shoot(){
System.out.println("发射飞弹");
}
}
下面来测试一下造出来的装备的效果,在Jbulider9中新建一个类命名为Battle.java,在Battle.java中敲入下列代码:
public class Battle
{
public Battle()
{
}
public static void main(String argv[]){
Tank tank = new Tank(); //生成一个坦克
Fighter fighter = new Fighter(); //生成一个战斗机
tank.move(); //坦克移动
tank.shoot(); //坦克射击
fighter.move(); //战斗机移动
fighter.shoot(); //战斗机射击
}
}
编译并运行Battle.java结果如下所示:
running
发射大炮
flying
发射飞弹
五、归纳总结
Java的类是不允许同时继承多个类的,也就是不允许所谓的多重继承。主要原因是让整个继承的结构明确完整,不会弄得很繁杂。可以使用多重接口的方法来完成类的多重继承机制。本例演示了继承和接口这两个非常重要概念的应用。
本章小结
本章介绍了Java面向对象的编程基础,包括类的基本概念、继承与多态、包和接口等。可以说本章的内容是本书中最为重要的一章。希望读者能够针对本章的概念大量的上机练习,尤其是对难以理解的概念,更要实际练一练。
分享到:
相关推荐
武装部队 递进.pptx,PPTfans_0226
巴克莱-美股-支付与IT服务业-美国支付、处理器与IT服务:亚马逊的支付武装-2019.9.9-32页(1)精品报告.pdf
人工智能-武装直升机飞行控制系统神经网络自适应控制研究.pdf
本资源是《python编程 从入门到实践》第十二章_外星人入侵_武装飞船项目 相关联的程序代码,账号的Python专栏文章会关联本资源。
用信息化武装中国装备制造业---装备制造全面方案
用信息化武装中国装备制造业---装备制造全面方案.pptx
初步回归法matlab代码精选的很棒的机器学习框架,库和软件的列表(按语言)。 ...##目录 -基于C ...-用汉密尔顿蒙特卡洛采样实现完整贝叶斯统计推断的概率编程语言 -一个简单的多武装Bandit库。 -软件包
思品教案-用科学知识武装头脑.docx
单层感知器神经网络matlab代码精选的很棒的机器学习框架,库和软件的列表(按语言)。...-用汉密尔顿蒙特卡洛采样实现完整贝叶斯统计推断的概率编程语言 -一个简单的多武装Bandit库。 -软件包/ C ++库,实现了几种
Vim武装成IDE,自动下载,自动安装,爽歪歪~你值得拥有。
-用汉密尔顿蒙特卡洛采样实现完整贝叶斯统计推断的概率编程语言 -一个简单的多武装Bandit库。 语音识别 -Kaldi是使用C ++编写的语音识别工具包,并根据Apache License v2.0获得许可。 Kaldi供语音识
所需模组: @ CBA_A3 @活@高手@ACEX @ACE Compat-RHS美国武装部队@ACE Compat-俄罗斯联邦的RHS武装部队@ACE兼容-RHS- GREF @ACE兼容-RHS- SAF @RHSUSAF R @RHSGREF @RHSSAF @特遣部队箭头广播电
iPhone 比较全的添加源.txt apt.weiphone.com--------------威锋源。 apt.178.com------------------很著名的 ... ...cydia.hackulo.us------------------这个源主要是 AppSync的下载必须的。... 让你的iphone 武装起来!
本页面可管理ARMA3 RCON提供各类命令,提供API接口,可接入机器人或其他工具。内置多种可选命令请使用您的RCON账号与密码进行登录.快速,高效执行rcon指令,本管理工具遵循并使用BattlEye RCon协议规范v2ARMA3 RCON是...
曙光EP430-GFX服务器 企业级应用新武装.pdf
合作随机多智能体多武装土匪对抗性腐蚀的鲁棒性_Cooperative Stochastic Multi-agent Multi-armed Bandits Robust to Adversarial Corruptions.pdf
基于多武装盗贼的联合学习计划 联合学习中基于多武装Bandit的客户端调度文章中的代码实现: 简短说明为了最大程度地减少FL(联合学习)培训的时间消耗,这项工作考虑了在理想情况下和非理想情况下的CS(客户端计划...
整个项目采购近2000台交换机,其中汇聚层骨干交换机采用了D-Link DES-6300三层路由交换机,而在接入层也全部采用D-Link DHS-3000系列交换机进行组建。实现对整个网络的统一规划集中管理,利用D-Link的分布式网管系统...
___治安综合治理暨武装保卫总结第2页-总结.docx