接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。
接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。
接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。另外,在 Java 中,接口类型可用来声明一个变量,他们可以成为一个空指针,或是被绑定在一个以此接口实现的对象。
一、接口的定义
接口定义的一般形式如下:
[访问权限修饰符] interface 接口名 (extends 父接口1,父接口2,...]{
//定义成员变量
[public][static][final]数据类型 变量名 = 初始值;
...
//定义成员方法
[public][abstract]返回类型 方法名([参数列表);
}
- 上面的定义中, interface表明这是一个接口,访问权限修饰符和类使用的一样,默认访问权是包访问权,一般用public来修饰它。和类有区别的是,接口都是抽象的,所以无须用abstract来修饰。
- extends和类中的一样,表明后面的列表是它的父接口。这里的父接口可以有若干多个,各个接口名之间用逗号隔开。接口的继承和类的继承基本原则是一样的。(其实更简单)
- 接口中的成员属性都是常量。在默认情况下,接口中的成员变量具有“ public static final”所联合规定的属性,这3个修饰符中,static和final没有替代的关键字,这意味所有的成员属性都是静态的、最终的,也就是静态常量。唯一可能改变的是访问权限修饰符public,但在接口中,不允许使用 protected和private关键字,这意味着所有的属性都是public类型的。
- 接口中的成员方法都是抽象方法。在默认情况下,接口中的成员方法具有“ public abstract”所联合规定的属性。同样 public在这里不可改变,abstract没有可以替代的关键字,又由于abstract和static不可联合使用,所以不可能是静态方法,故所有的方法都是具有public访问权限的抽象实例方法。
- 接口中的方法都是抽象的,而构造方法不可能为抽象方法,接口中自然就没有构造方法。
二、接口的特性
1.接口特点:
- 接口用关键字interface表示—-
interface 接口名 {}
- 类实现接口用implements表示—-
class 类名 implements 接口名 {}
- 接口不能实例化
那么,接口如何实例化呢?按照多态的方式来实例化
- 接口的子类
a:可以是抽象类。但是意义不大。
b:可以是具体类。要重写接口中的所有抽象方法。(推荐方案)
2.接口成员特点:
- 成员变量;只能是常量,并且是静态的并公共的。
默认修饰符:public static final
建议:自己手动给出。 - 构造方法:接口没有构造方法。
- 成员方法:只能是抽象方法。
默认修饰符:public abstract
建议:自己手动给出。 - 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。
接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错);接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)
三、接口和抽象类的区别
- 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
- 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
- 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。
- 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
四、接口的实现
当类实现接口的时候,类要实现接口中所有的方法。否则,类必须声明为抽象的类。类使用implements关键字实现接口。在类声明中,Implements关键字放在class声明后面。
...implements 接口名称[, 其他接口名称, 其他接口名称..., ...] ...
实例
class Demo_Interface {
public static void main(String[] args) {
Demo d = new Demo();
d.print();
}
}
interface Inter {
public static final int num = 10;
public abstract void print();
}
class Demo /*extends Object*/ implements Inter { //一个类不写继承任何类,默认继承Object类
public void print() {
System.out.println(num);
}
}
以上实例编译运行结果如下:
10
重写接口中声明的方法时,需要注意以下规则:
- 类在实现接口的方法时,不能抛出强制性异常,只能在接口中,或者继承接口的抽象类中抛出该强制性异常。
- 类在重写方法时要保持一致的方法名,并且应该保持相同或者相兼容的返回值类型。
- 如果实现接口的类是抽象类,那么就没必要实现该接口的方法。
在实现接口的时候,也要注意一些规则:
- 一个类可以同时实现多个接口。
- 一个类只能继承一个类,但是能实现多个接口。
- 一个接口能继承另一个接口,这和类之间的继承比较相似。
五、接口的继承
1.接口的单继承
一个接口能继承另一个接口,和类之间的继承方式比较相似。接口的继承使用extends关键字,子接口继承父接口的方法。
// 文件名: 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);
}
2.接口的多继承
在Java中,类的多继承是不合法,但接口允许多继承。
在接口的多继承中extends关键字只需要使用一次,在其后跟着继承接口。 如下所示:
public interface Hockey extends Sports, Event
文章参考—-菜鸟教程Java接口教程:https://www.runoob.com/java/java-interfaces.html