接口(英文: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 eatsMammal travels重写接口中申明的办法时,须要留神以下规定:类在实现接口的办法时,不能抛出强制性异样,只能在接口中,或者继承接口的抽象类中抛出该强制性异样。类在重写办法时要保持一致的办法名,并且应该放弃雷同或者相兼容的返回值类型。如果实现接口的类是抽象类,那么就没必要实现该接口的办法。在实现接口的时候,也要留神一些规定:一个类能够同时实现多个接口。一个类只能继承一个类,然而能实现多个接口。一个接口能继承另一个接口,这和类之间的继承比拟类似。接口的继承一个接口能继承另一个接口,和类之间的继承形式比拟类似。接口的继承应用extends关键字,子接口继承父接口的办法。上面的Sports接口被Hockey和Football接口继承:// 文件名: Sports.javapublic interface Sports{ public void setHomeTeam(String name); public void setVisitingTeam(String name);} // 文件名: Football.javapublic interface Football extends Sports{ public void homeTeamScored(int points); public void visitingTeamScored(int points); public void endOfQuarter(int quarter);} // 文件名: Hockey.javapublic 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接口。