由于Java不支持多重继承,即一个类只能有一个父类,为了克服单继承的缺点,Java语言引入了接口这一概念。接口是抽象方法定义的集合(接口中也可以定义一些常量值),是一种特殊的抽象类。接口中只包含方法的定义,没有方法的实现。接口中的所有方法都是抽象的。接口中成员的作用域修饰符都是public,接口中的常量值默认使用public static final修饰。由于一个类可以实现多个接口,因此通常可以采用实现多个接口的方式来间接的达到多重继承的目的。
在Java语言中,有些接口内部没有声明任何方法,也就是说实现这些接口的类不需要重写任何方法,这些没有任何方法声明的接口又被叫做标识接口,标识接口对实现它的类没有任何语义上的要求,它仅仅充当一个标识的作用,用来表明实现它的类属于一个特定的类型。这个标签类似于汽车的标志图标,每当人们看到一个汽车的标志图标时,就能知道这款汽车的品牌。Java类库中已存在的标识接口有Cloneable和Serializable等。在使用的时候会经常用instanceof来判断实例对象的类型是否实现了一个给定的标识接口。
下面通过一个例子来详细说明标识接口的作用。例如要开发一款游戏,游戏里面有一个人物角色专门负责出去寻找有用的材料,假设这个人物只收集矿石和武器,而不会收集垃圾,下例通过标识接口来实现这个功能。
import Java.util.ArrayList; interface Stuff{} //矿石 interface Ore extends Stuff{} //武器 interface Weapon extends Stuff{} //垃圾 interface Rubbish extends Stuff{} //金矿 class Gold implements Ore{ public String toString(){ return "Gold"; } } //铜矿 class Copper implements Ore{ public String toString(){ return "Copper"; } } //枪 class Gun implements Weapon{ public String toString(){ return "Gun"; } } //榴弹 class Grenade implements Weapon{ public String toString(){ return "Grenade"; } } class Stone implements Rubbish{ public String toString(){ return "Stone"; } } public class Test{ public static ArrayList<Stuff> collectStuff(Stuff[] s){ ArrayList<Stuff> al=new ArrayList<Stuff>(); for(int i=0;i<s.length;i++){ if(!(s[i] instanceof Rubbish)) al.add(s[i]); } return al; } public static void main(String[] args){ Stuff[] s={new Gold(),new Copper(),new Gun(),new Grenade(),new Stone()}; ArrayList<Stuff> al=collectStuff(s); System.out.println("The usefull Stuff collected is:"); for(int i=0;i<al.size();i++) System.out.println(al.get(i)); } } |
程序运行结果为:
The usefull Stuff collected is: Gold Copper Gun Grenade |
在上例中,设计了三个接口:Ore、Weapon和Rubbish分别代表矿石、武器和垃圾,只要是实现Ore或Weapon的类,游戏中的角色都会认为这是有用的材料,例如:Gold、Copper、Gun、Grenade,因此会收集,只要是实现Rubbish的类,都会被认为是无用的东西,例如Stone,因此不会被收集。
常见笔试题:
不能用来修饰interface的有( )
A:private B:public C:protected D:static
答案:A、C、D。见上面讲解。