Java/接口

维基教科书,自由的教学读本

C++中提供了多重继承的机制,即一个类可以有很多个父类,但是多重继承导致的奇异性一直引发很多争议,所以许多语言并不支援多重继承,而改以单一继承和接口继承。 Java提供了关键字interface来申明一个接口。接口可以规定方法的原型:方法名、参数列表以及返回类型,但不规定方法主体。interface 关键字用来声明一个接口。

接口的定义格式

interface 接口名称{ 
final 数据类型 成员名称 = 常量 ;
//数据成员必须赋值初值
abstract 返回值的数据类型 方法名称参数…);
//在抽象方法里,没有定义处理的方式
}

接口有下述属性:

  1. 接口默认就是抽象的。当需要声明一个接口的时候不需要使用 abstract 关键字。
  2. 接口中的每个方法默认也是抽象的,所以 abstract 关键字也不需要。
  3. 接口中的方法默认是 public 的。


示例:

/* File name : Animal.java */
interface Animal {
public void eat();
public void travel();
}

接口的实现 当一个类实现一个接口的时候,你可以认为类就是签订一个条约,同意去执行接口中的各种行为。如果一个类没有实现接口中的所有行为,这个类就必须声明为 abstract类。使用 implements 关键字来实现一个接口。这个 implements 关键字写在类的声明部分中 extends(如果有) 部分的后面。

/* 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 当覆写定义在接口中的方法时,如下是需要遵守的几条规则:

  1. 异常不应该声明在实现的方法中,而是应该在声明的接口方法中或者那些声明方法的接口的子类。
  2. 当覆写方法的时候应该包含接口方法的签名和相同类型或子类型的返回值。
  3. 接口实现类本身可以是抽象的,如果是抽象的,则接口中的方法没必要全部实现。

当实现接口时有如下几条规则:

  1. 类可以一次性实现多个接口。
  2. 类只可以继承一个父类,但是可以实现多个接口。
  3. 一个接口可以继承自另一个接口,和一个类继承自另一个类的方法相同。

接口的继承

一个接口可以继承另一个接口,和一个类继承自另一个类的方法相同。 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);
}


接口类有以下几个要求:

  1. 接口不能用于实例化对象。
  2. 接口没有构造方法。
  3. 接口不能包含成员变量,除了static和final变量。
  4. 接口中的所有的方法必须是抽象方法。
  5. 接口不是被类继承了,而是要被类实现。
  6. 接口支持多重继承。

接口是抽象方法的集合。如果一个类实现了一个接口,那么就需要继承这个接口中的所有抽象方法。 接口不是类。写一个接口和写一个类很相似,但是它们是两个不同的概念。类是描述一个对象的成员属性和行 为。接口只包含一个类所实现的行为。 除非实现了接口的类是抽象的,否则接口中的所有方法都需要在类中实现。 在以下方面,接口和类非常相似:

  1. 一个接口可以包含任意数量的方法。
  2. 一个接口以 .java 的扩展名写入文件中,并且接口的名字与文件名相同。
  3. 接口的字节码位于一个 .class 文件中。
  4. 接口位于包中,并且相应的字节码文件必须在和该包名匹配的文件夹结构下。

然而,在以下方面,接口和类是不同的:

  1. 不能实例化一个接口。
  2. 接口不能包含构造方法。
  3. 接口中的所有方法都是抽象的。
  4. 接口不能包含实例变量。接口中唯一能出现的变量必须被同时声明为 static 和 final 。
  5. 接口不能被类继承;它应该被类实现。
  6. 一个接口可以继承多个接口。