JAVA接口与实现

接口可以抽象出重要的行为标准,该行为标准用抽象的方法来表示。可以把实现接口的对象的引用赋值给接口变量,该接口变量可以调用被该类实现的接口方法,即体现该类根据接口里的行为标准给出的具体行为。

我们举个例子,轿车、卡车、拖拉机、摩托车和客车都是机动车的子类,其中机动车是一个抽象类,机动车中有诸如刹车、转向等方法是合理的,但是如果机动车类包含两个抽象方法,收取费用和调节温度,那么所有的子类都要重写这两个方法,即给出方法体,产生各自的收费或控制温度的行为。这显然不符合人们的思维逻辑,因为拖拉机可能不需要有收取费用或调节温度的功能,而其他的一些类,例如飞机、轮船等需要具体实现收取费用和调节温度。

接口的思想在于它可以要求某些类有相同名称的方法,但方法的具体内容(方法体的内容)可以不同,即要求这些类实现接口,以保证这些类一定有接口中所声明的方法(即所谓的方法绑定)。接口在要求一些类有相同名称的方法的同时,并不强迫这些类具有相同的父类。例如,各式各样的电器产品,它们可能归属于不同的种类,但国家标准要求电器产品都必须提供一个名称为ON的功能(为达到此目的,只需要求它们实现同一接口,该接口中有名字为ON的方法),但名称为ON的功能的具体行为由各个电气产品去实现。

再如,你是一个项目主管,你需要管理许多部门,这些部门要开发一些软件所需要的类,你可能要求某个类实现一个接口,也就是说,你对一些类是否具有这个功能非常关心,但不关心功能的具体实现,例如,这个功能是开机,你不关心是按下一个按钮还是打开一个开关来实现开机这个功能。在某些时候,你也许打个电话就可以了,告诉远方的一个开发部门实现你所规定的接口,并建议它们用什么方式来实现。如果没有这个接口,你可能要花费好多口舌来让你的部门找到那个实现开机的方法,也许它们给开机的那个方法起的名字是完全不同的名字。

理解了接口以后,我们来说一下实现接口的方法

使用关键字interface来定义一个接口。接口的定义和类的定义很相似,分为接口声明和接口体。

  1. 接口声明

定义接口包含接口声明和接口体,和类不同的是,定义接口时使用关键字interface来声明自己是一个接口,格式如下:

interface 接口的名字

接口体
接口体中包含常量的声明(没有变量)和抽象方法两个部分。接口体中只有抽象方法,没有普通的方法,而接口体中所有的常量的访问权限一定都是public,而且是static常量(允许省略public、final和static修饰符),所有的抽象方法的访问权限一定都是public(允许省略public、abstract修饰符),例如:

interface Printbable{
	public static final int MAX = 100;			//等价写法:int MAX = 100;
	public abstract void add();		//等价写法:void add();
	public abstract float sum(float x,float y);
}
  1. 实现接口

类实现接口
在java语言中,接口由类来实现以便使用接口中的方法。一个类需要在类声明中使用关键字implements声明该类实现一个或多个接口。如果实现多个接口,用逗号隔开接口名,例如A类实现Printable和Addable接口。

class A implements Printable,Addable

再如,Animal的Dog子类实现Eatable和Sleepable接口

class Dog extends Animal implements Eatable,Sleepable

重写接口中的方法
如果一个非抽象类实现了某个接口,那么这个类必须重写这个接口中的所有方法。需要注意的是,由于接口中的方法一定是public abstract方法,所以类在重写接口方法时不仅需要去掉abstract修饰符、给出方法体,而且方法的访问权限一定要明显地用public来修饰(否则就降低了访问权限,这是不允许的)。实现接口的非抽象类实现了该接口中的方法,即给出了方法的具体行为功能。

用户也可以自定义接口,一个JAVA源文件可以由类和接口组成。
注意:如果一个类声明实现一个接口,但没有重写接口中的所有方法,那么这个类必须是抽象类,也就是说,抽象类既可以重写接口中的方法,也可以直接拥有接口中的方法。

接口的细节说明
程序可以用接口名访问接口中的常量,但是如果一个类实现了接口,那么该类可以直接在类体中使用该接口中的常量。

定义接口时,如果关键字interface前面加上public关键字,就称这样的接口是一个public接口。public接口可以被任何一个类发现。如果一个接口不加public修饰,就称作友好接口,友好接口可以被与该接口在同一包中的类实现。

如果父类实现了某个接口,那么子类也就自然实现了该接口,子类不必再显式地使用关键字implement声明实现这个接口。

接口也可以被继承,即可以通过关键字extends声明一个接口是另一个接口的子接口。由于接口中的方法和常量都是public的,子接口将继承父接口中的全部方法和常量。

注意:java提供的接口在相应的包中,通过import语句不仅可以引入包中的类,也可以引入包中的接口,例如:
import java.io.*;
不仅引入了java.io中的类,同时也引入了该包中的接口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值