接口(英文:Interface),在 JAVA 编程语言中是一个形象类型,是形象办法的汇合,接口通常以 interface 来申明。一个类通过继承接口的形式,从而来继承接口的形象办法。
接口并不是类,编写接口的形式和类很类似,然而它们属于不同的概念。类形容对象的属性和办法。接口则蕴含类要实现的办法。
除非实现接口的类是抽象类,否则该类要定义接口中的所有办法。
接口无奈被实例化,然而能够被实现。一个实现接口的类,必须实现接口内所形容的所有办法,否则就必须申明为抽象类。另外,在 Java 中,接口类型可用来申明一个变量,他们能够成为一个空指针,或是被绑定在一个以此接口实现的对象。
接口与类类似点:
- 一个接口能够有多个办法。
- 接口文件保留在 .java 结尾的文件中,文件名应用接口名。
- 接口的字节码文件保留在 .class 结尾的文件中。
- 接口相应的字节码文件必须在与包名称相匹配的目录构造中。
- 接口与类的区别:
- 接口不能用于实例化对象。
- 接口没有构造方法。
- 接口中所有的办法必须是形象办法,Java 8 之后 接口中能够应用 default 关键字润饰的非形象办法。
- 接口不能蕴含成员变量,除了 static 和 final 变量。
- 接口不是被类继承了,而是要被类实现。
-
接口反对多继承。
接口个性
接口中每一个办法也是隐式形象的, 接口中的办法会被隐式的指定为 public abstract(只能是 public abstract,其余修饰符都会报错)。
接口中能够含有变量,然而接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 润饰会报编译谬误)。
接口中的办法是不能在接口中实现的,只能由实现接口的类来实现接口中的办法。
抽象类和接口的区别
抽象类中的办法能够有办法体,就是能实现办法的具体性能,然而接口中的办法不行。
抽象类中的成员变量能够是各种类型的,而接口中的成员变量只能是 public static final 类型的。
接口中不能含有动态代码块以及静态方法 (用 static 润饰的办法),而抽象类是能够有动态代码块和静态方法。
一个类只能继承一个抽象类,而一个类却能够实现多个接口。
注:JDK 1.8 当前,接口里能够有静态方法和办法体了。
注:JDK 1.8 当前,接口容许蕴含具体实现的办法,该办法称为 ” 默认办法 ”,默认办法应用 default 关键字润饰。更多内容可参考 Java 8 默认办法。
注:JDK 1.9 当前,容许将办法定义为 private,使得某些复用的代码不会把办法裸露进来。更多内容可参考 Java 9 公有接口办法。
接口的申明
接口的申明语法格局如下:
[可见度] interface 接口名称 [extends 其余的接口名] {
// 申明变量
// 形象办法
}
Interface 关键字用来申明一个接口。上面是接口申明的一个简略例子。
NameOfInterface.java 文件代码:/* 文件名 : NameOfInterface.java */
import java.lang.*;
// 引入包
public interface NameOfInterface
{
// 任何类型 final, static 字段
// 形象办法
}
接口有以下个性:
接口是隐式形象的,当申明一个接口的时候,不用应用 abstract 关键字。
接口中每一个办法也是隐式形象的,申明时同样不须要 abstract 关键字。
接口中的办法都是私有的。
实例
Animal.java 文件代码:/* 文件名 : Animal.java */
interface Animal {public void eat();
public void travel();}
接口的实现
当类实现接口的时候,类要实现接口中所有的办法。否则,类必须申明为形象的类。
类应用 implements 关键字实现接口。在类申明中,Implements 关键字放在 class 申明前面。
实现一个接口的语法,能够应用这个公式:
接口语法:
…implements 接口名称 [, 其余接口名称, 其余接口名称 …, …] …
实例
MammalInt.java 文件代码:/* 文件名 : 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 接口继承:// 文件名: Sports.java
public interface Sports
{public void setHomeTeam(String name);
public void setVisitingTeam(String name);
}
// 文件名: Football.java
public interface Football extends Sports
{public void homeTeamScored(int points);
public void visitingTeamScored(int points);
public void endOfQuarter(int quarter);
}
// 文件名: 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 接口的类须要实现五个办法,其中两个来自于 Sports 接口。