接⼝
基本概念
在现实生活中,USB接口实际上是某些企业和组织制定的一种约定或标准,规定了接口的大小、形状等。按照该约定设计的各种设备,如U盘、USB风扇、USB键盘都可以插到USB接口上正常工作。USB接口相关工作是按照如
下步骤进行的。
1.约定USB接⼝标准。
2.制作符合USB接⼝约定的各种具体设备。
3.把USB设备插到USB接⼝上进⾏⼯作
Java中接口的作用和生活中的接口类似,它提供一种约定,使得实现接口的类在形式上保持一致。
如果抽象类中所有的方法都是抽象方法,就可以使用Java提供的接口来表示。从这个角度来讲,接口可以看作是一种特殊的“抽象类”,但是采用与抽象类完全不同的语法来表示,两者的设计理念也不同。
约定好规范,然后按照规范来做,接⼝就是定义规范
简单来说,接⼝是⼀个不能实例化的类型
声明
接口类型的定义类似于类的定义,语法格式如下。
public interface 接口名{
//接口成员
}
语法解析:
1.和抽象类不同,定义接⼝使⽤interface修饰符。
2.接⼝的访问权限是public或包访问权限,与类的访问权限类似。
3.⼀个接⼝可以继承其它接⼝,称为⽗接⼝,并且接⼝可以多继承。它将继承⽗接⼝中声明的常量和抽象⽅法。
4.成员列表中的成员变量声明 [public] [static] [final]
数据类型 变量名 = 常量; 即接⼝中成员变量默认都是public
、 static
、 final
的,因此 public static final
可以省略。
5.成员列表中的成员⽅法声明 public abstract 返回值类型 方法名(参数列表)
; 即接⼝中的⽅法默认都是public
、 abstract
的,因此 public abstract
可以省略。
与抽象类一样,使用接口要通过子类,子类通过 implements 关键字实现接口。实现接口的语法格式如下:
public 类名 implements 接口名{
// 实现抽象方法
// 声明普通方法
// 声明成员变量
}
语法解析:
1.实现接口使用implements关键字
2.一个类可以实现多个接口,各接口之间用逗号分隔开
3.实现接口的类必须实现接口中定义的所有抽象方法,即使类中不使用某个抽象方法也必须实现它,通常用空方法体实现子类不需要的抽象方法,如果抽象方法有返回值,可返回默认值。
4.接口的实现类允许包含普通方法。
5.在实现抽象方法时需要指定public权限,否则会产生编译错误。
一个普通类只能继承一个父类,但同时能实现多个接口,也可以同时继承抽象类和实现接口。
-
接口和类、抽象类是一个层次的概念,命名规则相同。
-
修饰符如果是public,则该接口在整个项目中可见。如果省略修饰符,该接口只在当前包中可见。
-
和抽象类一样,接口同样不能实例化,但接口中不允许有构造方法。
-
接口之间可以通过extends实现继承关系,一个接口可以继承多个接口,但接口不能继承类。
-
类只能继承一个父类,但可以通过
implements
实现多个接口。一个类要实现某个接口,那就必须实现接口中的所有方法,否则必须定义为抽象类。若一个类在继承父类的同时又实现了多个接口,extends
必须位于implements
之前。实现多个接口的语法格式如下:
public 类名 extends 类名 implements 接口1,接口2 { }
-
接口与接口之间是继承关系,使用
extends
关键字,接口可以多继承,多个接口使用,隔开。public interface 接口名 extends 接口1,接口2 { }
-
接口中成员变量声明形式如下:
[public] [static] [final] 数据类型 变量名 = 值;
-
接口中方法的声明形式如下:
[public] [abstract] 返回值类型 方法名(参数列表);
接口的好处:
- 弥补了类单继承的不足,一个类同时可以实现多个接口。
- 让程序可以面向接口编程,这样程序员可以灵活方便的切换各种业务实现。
现在要写一个A类,想让他既是学生,偶然也是司机能够开车,偶尔也是歌手能够唱歌。那我们代码就可以这样设计。
综上所述:接口弥补了单继承的不足,同时可以轻松实现在多种业务场景之间的切换。
新特性
JDK8
在JDK8中default
关键字可用于在接口中修饰方法,default
修饰的方法可以有具体实现,也只能在接口中实现,default
修饰的方法可以被重写。
在JDK8中还可以有static
修饰的方法,称为静态方法,类方法可以直接使用接口名.方法名调用,不能被继承。
JDK9
在JDK9中新增private
方法,声明只能在本接口中使用的方法。
抽象类与接口的区别
- 多继承:子类只能继承一个直接抽象类;子类可以实现多个接口
- 实现:子类使用extends继承抽象类;实现类通过implements实现接口
- 成员:抽象类中可以有实例成员、静态成员、抽象方法,抽象类中的成员方法不能不能用default关键字修饰;接口中只有常量、抽象方法,JDK8之后新增static 和default方法,JDK9之后新增private方法
- 成员变量修饰符:抽象类可以定义变量,也可以定义常量;接口中只能定义常量(public static final修饰的常量)
- 子类实现:子类在实现抽象方法是不允许缩小访问权限;实现类在实现抽象方法时必须指定public权限
- 构造函数:抽象类可以有构造函数;接口中不能定义构造函数
- 最高层:类的最高层是Object;接口中没有最高层
- 相同点:两者都不能实例化;都是引用类型;都可以包含抽象方法