黑马程序员---接口
1、类实现接口
在java语言中,接口有类来实现以便使用接口中的方法。一个类需要在类声明中使用关键字implements声明该类实现一个或多个接口。如果实现多个接口,用逗号隔开接口名,如A类实现Printable和Addable接口。
class A implements Printable,Addable
再比如Animal的Dog子类实现Eatable和Sleepable接口。
class Dog extends Animal implements Eatable , Sleepable
2、重写接口中的方法
如果一个非抽象类实现了某个接口,那么这个类必须重写这个接口中的所有方法。需要注意的是,由于接口中的方法一定是public static方法,所有类在重写接口方法时不仅要去掉abstract修饰符、给出方法体,而且方法的访问权限一定要明显的用public来修饰(否则就降低了访问权限,这是不允许的)。实现接口的非抽象类实现了该接口中的 方法,即给出了方法的具体行为功能。
用户也可以自定义接口,一个java源文件可以由类和接口组成。
3、接口的细节说明
程序可以用接口名访问接口中的常量,但是如果一个类实现了接口,那么该类可以直接在类体中使用该接口中的常量。
定义接口时,如果关键字interface前面加上public关键字,就称这样的接口是一个public接口。public接口可以被任何一个类实现。如果一个借口不加public修饰,就称作友好接口,友好接口可以被与该接口在同一个包中的类实现。
如果父类实现了某个接口,那么子类也就自然实现了该接口,子类不必再显示地使用关键字implements 声明实现了该接口。
接口也可以被继承,即可以通过关键字extends声明一个接口是另一个接口的子接口。由于接口中的方法和常量都是public的,子接口将继承父接口中的全部方法和常量。
(注:java提供的接口都在相应的包中,通过import语句不仅可以引用包中的类,也可以引入包中的接口,例如:import java.io.*; 不仅引用了java.io包中的类,同时也引用了该包中的接口。)
理解接口
假如轿车、卡车、拖拉机、摩托车和客车都是机动车的子类,其中机动车是一个抽象类,机动车中有诸如“刹车”、“转向”等方法是合理,即要求轿车、卡车、拖拉机、摩托车和客车都必须具体实现“刹车”、“转向”等功能,但是如果机动车类包含有两个抽象方法“收取费用”和“调节温度”。那么所有的子类都必须要重写这两个方法,即给出方法体,产生各自的收费或控制温度的行为。这显然不符合人们的思维逻辑,因为拖拉机可能不需要有“收取费用”或“调节温度”的功能,而其他的一些类,比如飞机、轮船等可能也需要具体实现“收取费用”、“调节温度”。
接口的思想在于它可以要求某些类有相同名称的方法,但方法的具体内容(方法体的内容) 可以不同,即要求这些类实现接口,以保证这些类一定有接口中所声明的方法(即所谓的方法绑定) 。接口在要求一些类有相同名称的方法的同时,并不强迫这些类具有相同的父类,比如,各式各样的电器商品,他们可能归属不同的种类,但国家标准要求电器产品必须提供一个名称为on的功能(为达到此目的,只需要求他们实现同一接口,该接口中有名字为on的方法),但名称为on的功能的具体行为由各个电器产品去实现。
在下面的例子中MotorVehicles类(机动车)的子类Taxi(出租车类)和Bus(公共汽车类)必须有名称为brake的方法(刹车功能),但额外要求Taxi类有名称为controlAirTemperature和charge的方法(有空调和收费功能),即要求Bus只实现一个接口。
例子:
abstract class MotorVehicles{
abstract void brake();
}
interface MoneyFare{
void charge();
}
interface ControlAirTemperature{
void controlAirTemperature();
}
class Bus extends MotorVehicles implements MoneyFare{
void brake() {
}{
System.out.println("公共汽车使用新式刹车技术");
}
public void charge(){
System.out.println("公共汽车:一元/一张,不计算公里数");
}
}
class Taxi extends MotorVehicles implements MoneyFare,ControlAirTemperature{
//Taxi实现链各个接口
void brake(){
System.out.println("出租车使用盘式刹车技术");
}
public void charge(){
System.out.println("出租车:2元/公里,起价3公里");
}
public void controlAirTemperature(){
System.out.println("出租车安装了海尔空调");
}
}
class Cinema implements MoneyFare,ControlAirTemperature{
public void charge(){
System.out.println("电影院:门票,十元/张");
}
public void controlAirTemperature(){
System.out.println("电影院安装了中央空调");
}
}
public class Example {
public static void main(String[] args) {
Bus bus101=new Bus();
Taxi buleTaxi =new Taxi();
Cinema redStarCinema=new Cinema();
bus101.brake();
bus101.charge();
buleTaxi.brake();
buleTaxi.charge();
buleTaxi.controlAirTemperature();
redStarCinema.charge();
redStarCinema.controlAirTemperature();
}
}
运行效果如图: