一、实例说明
这是一个很有趣的例子,该例将实现两个类车子和飞机,然后设计出两个具有攻击性的战斗工具,坦克和战斗机。将坦克和战斗机赋予两个动作,移动和射击。本例用来加深对继承和接口等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面向对象的编程基础,包括类的基本概念、继承与多态、包和接口等。可以说本章的内容是本书中最为重要的一章。希望读者能够针对本章的概念大量的上机练习,尤其是对难以理解的概念,更要实际练一练。