第1节 接口
推荐给好友
打印
加入收藏
更新于2009-05-10 13:45:04

7.1 接口

接口
与抽象类一样都是定义多个类的共同属性使抽象的概念更深入了一层,是一个“纯”抽象类,它只提供一种形式,并不提供实现允许创建者规定方法的基本形式:方法名、自变量列表以及返回类型,但不规定方法主体也可以包含基本数据类型的数据成员,但它们都默认为static和final

7.1.1 接口的作用及语法

接口的作用
是面向对象的一个重要机制
实现多继承,同时免除C++中的多继承那样的复杂性
建立类和类之间的“协议”
把类根据其实现的功能来分别代表,而不必顾虑它所在的类继承层次;这样可以最大限度地利用动态绑定,隐藏实现细节
实现不同类之间的常量共享

7.1.1 接口的作用及语法——与抽象类的不同

接口允许我们在看起来不相干的对象之间定义共同行为



7.1.1 接口的作用及语法——例7_1

保险公司的例子
具有车辆保险、人员保险、公司保险等多种保险业务,各种业务的保险对象不同,但在对外提供服务方面具有相似性,如都需要计算保险费(premium)等,因此可声明一个Insurable 接口,并使不同的类实现这个接口
在UML图中,实现接口用带有空三角形的虚线表示



7.1.1 接口的作用及语法

接口的语法
使用关键字interface声明接口

声明格式为
[接口修饰符] interface 接口名称 [extends 父接口名]{…//方法的原型声明或静态常量}
接口的数据成员一定要赋初值,且此值将不能再更改,允许省略final关键字
接口中的方法必须是“抽象方法”,不能有方法体,允许省略public及abstract关键字

7.1.1 接口的作用及语法——例7_1保险接口的声明

Insurable 接口声明如下,其中的方法都是抽象方法
public interface Insurable {public int getNumber();
public int getCoverageAmount();
public double calculatePremium();
public Date getExpiryDate(); }

7.1.1 接口的作用及语法——例7_2

声明一个接口Shape2D,可利用它来实现二维的几何形状类Circle和Rectangle
把计算面积的方法声明在接口里
pi值是常量,把它声明在接口的数据成员里
interface Shape2D{    //声明Shape2D接口
final double pi=3.14;   //数据成员一定要初始化
public abstract double area(); //抽象方法}
在接口的声明中,允许省略一些关键字,也可声明如下
interface Shape2D{
double pi=3.14;
double area(); }

7.1.2 实现接口

接口的实现
接口不能用new运算符直接产生对象,必须利用其特性构造新的类,再用新类来创建对象
利用接口构造类的过程,称为接口的实现
使用implements关键字,语法如下
public class 类名称 implements 接口名称 { /* Bodies for the interface methods */
/* Own data and methods. */ }必须实现接口中的所有抽象方法
来自接口的方法必须声明成public

7.1.2 实现接口——例7_3

实现接口Insurable,声明汽车类实现例6.1中的Insurable接口,实现接口中的所有抽象方法
public class Car implements Insurable { public int getPolicyNumber() { // write code here }
public double calculatePremium() { // write code here }
public Date getExpiryDate() { // write code here }
public int getCoverageAmount() { // write code here }
public int getMileage() { //新添加的方法 //write code here
} }

7.1.2 实现接口 ——对象转型

对象可以被转型为其所属类实现的接口类型
getPolicyNumber、calculatePremium是Insurable接口中声明的方法
getMileage是Car类新添加的方法,Insurable接口中没有声明此方法
Car? jetta = new Car();
Insurable? item = (Insurable)jetta; //对象转型为接口类型
item.getPolicyNumber();
item.calculatePremium();
item.getMileage();??????? // 接口中没有声明此方法,不可以
jetta.getMileage();?????? // 类中有此方法,可以
((Car)item).getMileage(); // 转型回原类,可调用此方法了

7.1.2 实现接口——例7_4

声明Circle与Rectangle两个类实现Shape2D接口
class Circle implements Shape2D
{double radius;
public Circle(double r)
{ radius=r;}
public double area()
{ return (pi * radius * radius);}}

class Rectangle implements Shape2D
{ int width,height;
public Rectangle(int w,int h)
{width=w;height=h;}
public double area()
{ return (width * height); }
}

7.1.2 实现接口——例7_4运行结果

测试类
public class InterfaceTester { public static void main(String args[]){ Rectangle rect=new Rectangle(5,6);
System.out.println("Area of rect = " + rect.area());
Circle cir=new Circle(2.0);
System.out.println("Area of cir = " + cir.area());
}}运行结果
Area of rect = 30.0
Area of cir = 12.56

7.1.2 实现接口——例7_5

声明接口类型的变量,并用它来访问对象
public class VariableTester {public static void main(String []args)
{ Shape2D var1,var2;
var1=new Rectangle(5,6);
System.out.println("Area of var1 = " + var1.area());
var2=new Circle(2.0);
System.out.println("Area of var2 = " + var2.area());
}}
输出结果
Area of var1 = 30.0
Area of var2 = 12.56

7.1.2 实现接口——MovableObject接口

MovableObject接口定义了所有“可移动对象”能做的事情
public interface? MovableObject { public boolean??? start();
public void?????? stop();
public boolean??? turn(int degrees);
public double???? fuelRemaining();
public void?????? changeSpeed(double kmPerHour);}

7.1.2 实现接口——MovableObject接口的实现

Plane、Car、 Train、 Boat 分别实现 MovableObject 接口
public class Plane implements? MovableObject { public int?? seatCapacity;
public Company? owner;
public Date??lastRepairDate;
//实现MovalbelObject接口的所有方法
public boolean start() { //启动飞机,成功则返回true }
public void stop() { //停止 }
public boolean turn(int degrees) { //转向,成功则返回true}
public double fuelRemaining() { //返回燃料剩余量 }
public void changeSpeed(double kmPerHour) { //改变速度 }
//plane类自己的方法:
public Date getLastRepairDate() { //... }
public double calculateWindResistance() { //....} }

7.1.2 实现接口——RemoteControl类

为 MovableObjects安装遥控器(remote control)
public class RemoteControl { ??private MovableObject???machine; ???
RemoteControl(MovableObject m) {machine = m; }
? //按下“启动”按钮: public void start()
{??? boolean okay = machine.start();
??? if (!okay) display("No Response on start");
??? //... } }
remote control 构造方法的形参类型为 MovableObject,它可以是Plane, Car, Train, Boat, 等等

7.1.3 多重继承

多重继承

Java的设计以简单实用为导向,不允许一个类有多个父类
但允许一个类可以实现多个接口,通过这种机制可实现多重继承
一个类实现多个接口的语法如下
[类修饰符] class 类名称 implements 接口1,接口2, …

{
… …
}

7.1.3 多重继承——Car的例子

Car类可以实现接口Insurable,Drivable,Sellable
public class Car implements Insurable, Drivable, Sellable

{ ?? ....
}



7.1.3 多重继承——例7_6

声明Circle类实现接口Shape2D和Color
具有pi与area()方法,用来计算面积
Color则具有setColor方法,可用来赋值颜色

通过实现这两个接口,Circle类得以同时拥有这两个接口的成员,达到了多重继承的目的
interface Shape2D{ //声明Shape2D接口
final double pi=3.14; //数据成员一定要初始化

public abstract double area(); //抽象方法
}interface Color{ void setColor(String str); //抽象方法}
class Circle implements Shape2D,Color // 实现Circle类
{ double radius;

String color;
public Circle(double r) //构造方法
{ radius=r; }
public double area() //定义area()的处理方式
{ return (pi*radius*radius); }
public void setColor(String str) //定义setColor()的处理方式
{ color=str; System.out.println("color="+color); }}

测试类

public class MultiInterfaceTester{
public static void main(String args[]) {
Circle cir;
cir=new Circle(2.0);
cir.setColor("blue");
System.out.println("Area = " + cir.area());
}
}

输出结果

color=blue

Area = 12.56

7.1.4 接口的扩展

接口的扩展

接口可通过扩展的技术派生出新的接口
原来的接口称为基本接口(base interface)或父接口(super interface)
派生出的接口称为派生接口(derived interface)或子接口(sub interface)
派生接口不仅可以保有父接口的成员,同时也可加入新成员以满足实际问题的需要
实现接口的类也必须实现此接口的父接口

接口扩展的语法

interface 子接口的名称 extends 父接口的名称1 { … …}

7.1.4 接口的扩展——例7_7

Shape是父接口,Shape2D与Shape3D是其子接口。Circle类及Rectangle类实现接口Shape2D,而Box类及Sphere类实现接口Shape3D



部分代码如下
// 声明Shape接口
interface Shape{
double pi=3.14;
void setColor(String str); }//声明Shape2D接口扩展了Shape接口
interface Shape2D extends Shape {double area();}
class Circle implements Shape2D {
double radius;
String color;

public Circle(double r) { radius=r; }
public double area() {
return (pi*radius*radius);

}
public void setColor(String str){
color=str;

System.out.println("color="+color);
}
}

public class ExtendsInterfaceTester{ //

测试类

public static void main(String []args) {
Circle cir;
cir=new Circle(2.0);
cir.setColor("blue");
System.out.println("Area = " + cir.area());
}
}

7.1.4 接口的扩展——例7_7运行结果

运行结果

color=blue
Area = 12.56

说明

首先声明了父接口Shape,然后声明其子接口Shape2D
之后声明类Circle实现Shape2D子接口,因而在此类内必须明确定义setColor()与area()方法的处理方式
最后在主类中我们声明了Circle类型的变量cir并创建新的对象,最后通过cir对象调用setColor()与area()方法

7.1.4 接口的扩展——Insurable接口的例子



FixedInsurable 和DepreciatingInsurable接口

都继承了Insurable接口
实现它们类也必须实现Insurable接口中的所有方法
public interface DepreciatingInsurable extends? Insurable { ??? public double computeFairMarketValue();
}
public interface FixedInsurable extends? Insurable { ??? public int getEvaluationPeriod();
}



上一节       下一节
相关链接


 
关于我们 | 诚邀加盟 | 客户服务 | 相关法律 | 网站地图 | 友情链接 | 服务信箱:service@eefocus.com
© 2006 与非门科技信息咨询(北京)有限公司 All Rights Reserved.