Java接口
接口是抽象方法的集合。一个类实现一个接口,从而继承接口的抽象方法。
接口不是一个类。写一个界面类似写一个类,但它们是两个不同的概念。类描述对象的属性和行为。接口包含一个类实现的行为。
除非实现接口的类是抽象,接口中的所有方法必须在类中定义。
接口是一个类似的类中的方法如下:
-
接口可以包含任何数量的方法。
-
接口被写在同一个 .java 扩展名的文件,并提供相应的文件的名称的接口的名称。
-
接口的字节码会出现在一个 .class文件。
-
接口出现在包中,及其相应的字节码文件必须相匹配的包名的目录结构。
然而,一个接口是一类在几个方面有所不同,其中包括:
-
不能实例化一个接口。
-
接口不包含任何构造函数.
-
所有在接口中的方法都是抽象的.
-
接口不能包含实例字段。可以出现在一个接口的唯一字段必须声明static和final.
-
接口不是由一个类扩展,它是由类实现.
-
一个接口可以扩展多个接口.
声明接口:
interface关键字用于声明一个接口。下面是一个简单的例子来声明一个接口:
例子:
下面来看看,描绘封装一个例子:
/* File name : NameOfInterface.java */ import java.lang.*; //Any number of import statements public interface NameOfInterface { //Any number of final, static fields //Any number of abstract method declarations }
接口具有以下特性:
-
接口是隐式抽象的。声明一个接口,不需要使用abstract关键字.
-
在接口中的每个方法也隐式抽象的,所以abstract关键字不需要。
-
在接口中的方法是隐式公开的。
例子:
/* File name : Animal.java */ interface Animal { public void eat(); public void travel(); }
接口的实现:
当一个类实现一个接口,可以认为该类同意将接口的具体行为。如果一个类不执行该接口的所有行为,该类必须自己声明为abstract。
类使用implements关键字来实现一个接口。下面的扩展声明的部分implements关键字出现在类声明。
/* File name : MammalInt.java */ public class MammalInt implements Animal{ public void eat(){ System.out.println("Mammal eats"); } public void travel(){ System.out.println("Mammal travels"); } public int noOfLegs(){ return 0; } public static void main(String args[]){ MammalInt m = new MammalInt(); m.eat(); m.travel(); } }
这将产生以下结果:
Mammal eats Mammal travels
当重写接口中定义的方法有几个应遵循的规则:
-
检查型异常不应超过该接口的方法或那些由接口方法声明的子类中声明的那些其他的实现方法进行声明。
-
重写方法时,应保持接口的方法和相同的返回类型或子类型的签名。
-
一个实现类本身可以是抽象的,如果是这样的接口方法需要无法实施(实现)。
当要实现接口,需要了解有几个规则:
-
一个类可以同时实现多个接口。
-
一个类只能扩展一个类,但实现多个接口。
-
一个接口可以扩展另一个接口,类似于一个类可以扩展另一个类中的方法。
扩展接口:
一个接口可以扩展另一个接口,类似于一个类可以扩展另一个类中的方法。extends关键字来扩展接口,及子接口继承父接口的方法。
下面的Sports接口是由Hockey和Football接口扩展。
//Filename: Sports.java public interface Sports { public void setHomeTeam(String name); public void setVisitingTeam(String name); } //Filename: Football.java public interface Football extends Sports { public void homeTeamScored(int points); public void visitingTeamScored(int points); public void endOfQuarter(int quarter); } //Filename: Hockey.java public interface Hockey extends Sports { public void homeGoalScored(); public void visitingGoalScored(); public void endOfPeriod(int period); public void overtimePeriod(int ot); }
Hockey接口有四种方法,但它继承了两个来自Sports,因此,实现Hockey类需要实现所有六个方法。同样地,一个实现Football 类需要定义从Football 的三种方法,并从Sports的两种方法。
扩展多个接口:
一个Java类只能继承一个父类。多重继承是不允许的。接口不是类,但是,一个接口可以扩展多个父接口。
extends关键字被使用一次,并且父接口在一个逗号分隔的列表中声明。
例如,如果Hockey接口扩展两个Sports和Event,将它声明为:
public interface Hockey extends Sports, Event
标签接口:
当父接口不包含任何方法的最常见的用途扩展接口发生。例如,在java.awt.event包中的MouseListener接口扩展java.util.EventListener继承,它被定义为:
package java.util; public interface EventListener {}
其中不带方法的接口被称为标记接口。也有标记接口两个基本的设计目的:
创建一个共同的父接口: 至于与事件监听器接口,这是由几十个Java API中的其他接口扩展,可以使用一个标记接口之间建立一组接口到一个共同的父接口。例如,当一个接口扩展事件监听器,则JVM知道这个特定的接口是要在一个事件的代理方案来使用。
增加了数据类型到类: 这种情况就是术语标签的由来。实现一个标记接口的类不需要定义任何方法(因为接口不具有任何),但通过类的多态性成为一个接口类型。