接口
关键字:interface
接口中所有的属性都是公开静态常量,默认被public static final修饰
接口中所有的方法都是公开抽象方法,默认被public abstract修饰
接口中没有构造方法,不能参与创建对象的过程。
interface Inter{
void m1();
void m2();
}
//实现类1,实现接口可以不用实现所有方法,则是抽象类
abstract class MyInter1 implements MyInter{}
//实现类2,实现所有方法则不是抽象类
class MyInter2 implements MyInter{
public void m1(){}
public void m2(){}
}
接口与抽象类的异同点
相同点:
- 编译之后都能生成字节码文件(.class文件)
- 不能创建对象
- 可以声明为引用
不同点:
- 接口中所有的属性都是公开静态常量,默认被public static final修饰;抽象类没有要求
- 接口中所有的方法都是公开抽象方法,默认被public abstract修饰;抽象类没有要求
- 接口中没有构造方法,静态、动态代码块;抽象类可以存在
- 接口是多继承,抽象类是单继承。
接口新语法
1.在JDK8.0以后,接口中允许存在静态方法:
语法:public static 返回值类型 方法名(参数表){
//方法实现
}
调用:接口名.静态方法名(实参);
2. JDK8.0以后,接口中可以定义默认方法:
语法:public default 返回值类型 方法名(参数表){
//方法的实现
}
作用: 保证接口的向后兼容性,即接口定义之后,可能存在多个实现类,如果随意更改接口中的方法,则每一个实现类都必须修改,不利于代码的维护,如果设置成默认方法则不影响。
注意: 如果一个类同时实现了两个接口,并且两个接口中存在相同声明的两个默认方法,结果编译报错。
解决方式: 实现类覆盖接口中的默认方法。
如果想要访问接口中的同名的默认方法,可以使用接口名.super.方法名()的方式访问。
interface IA{
void m1();
public default void m2(){
System.out.println("IA default m2().....");
}
}
interface IB{
default void m2(){
System.out.println("IB default m2().....");
}
}
class ClassE{
public void mm(){}
}
class MyClass extends ClassE implements IA,IB{
public void m1(){}
public void m2(){
IA.super.m2();//多继承的复杂性造成的
IB.super.m2();
System.out.println("MyClass m2().....");
}
public void mm(){
super.mm();//调用父类的mm()
System.out.println("MyClass mm()");
}
}
接口与抽象类不同点
抽象类 | 接口 | |
---|---|---|
关键字 | abstract(extends) | interface(implements) |
属性 | 实例变量、静态变量 4个访问修饰符随意 | 公开静态常量 |
方法 | 抽象方法、普通成员方法 | 抽象方法、静态方法(JDK8.0)、默认方法(JDK8.0)、私有方法(JDK9.0) |
构造方法 | 有构造方法 | 没有构造方法 |
继承关系 | 单继承 | 多继承 |
接口的分类
- 标记接口:空接口,接口中没有任何的属性和方法
- 常量接口:接口中只有常量,没有任何的方法
- 函数式接口:接口中只有一个抽象方法
- 普通接口:至少有2个以上的抽象方法的接口