【正确答案】
【答案解析】由于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
在上例中,设计了3个接口:Ore、Weapon和Rubbish分别代表矿石、武器和垃圾,只要是实现Ore或Weapon的类,游戏中的角色都会认为这是有用的材料,例如Gold、Copper、Gun、Grenade,因此会收集;只要是实现Rubbish的类,都会被认为是无用的东西,例如Stone,因此不会被收集。
常见笔试题:
不能用来修饰interface的有______
A.private B.public C.protected D.static
答案:A、C、D。见上面讲解。