基本定义:

如果在开发的过程中,如果想完全的对外面隐藏实现过程,则可以通过接口进行描述。
接口可以理解为一个纯粹的抽象类。JDK1.8引入了Lambda表达式的概念,除了抽象法法语全局常量之外,还可以定义普通方法活静态方法。但是从设计角度来讲,接口之中的组成还是应该以抽象方法和全局常量为主。
接口主要由interface定义接口。

特性:

1.接口需要被子类实现,一个子类可以实现多个接口。
2.子类(如果不是抽象类)一定要覆写接口之中的全部抽象方法。
3.接口对象可以利用子类对象的上转型进行实例化。
接口的基本使用:

  1. interface IMessage{
  2. public static final String INFO = "111";
  3. public abstract String getInfo();
  4. }
  5. class MessageImpl implements IMessage{
  6. public String getInfo(){
  7. return "test";
  8. }
  9. }
  10. class Untitled {
  11. public static void main(String[] args) {
  12. IMessage msg = new MessageImpl();
  13. System.out.println(msg.getInfo());
  14. System.out.println(msg.getClass());
  15. System.out.println(IMessage.INFO);
  16. }
  17. }

以上是接口的基本使用,但是在java里面之所以使用接口的主要目的是一个子类可以实现多继承的概念。
实现多个接口:

  1. interface IMessage{
  2. public static final String INFO = "111";
  3. public abstract String getInfo();
  4. }
  5. interface IChannel{
  6. public abstract boolean connect();
  7. }
  8. class MessageImpl implements IMessage,IChannel{
  9. public String getInfo(){
  10. if (this.connect()) {
  11. return "消息已经成功发送";
  12. }
  13. else {
  14. return "通道获取失败,无法获取消息";
  15. }
  16. }
  17. public boolean connect(){
  18. return true;
  19. }
  20. }
  21. class Untitled {
  22. public static void main(String[] args) {
  23. IMessage msg = new MessageImpl();
  24. System.out.println(msg.getInfo());
  25. System.out.println(msg.getClass());
  26. System.out.println(IMessage.INFO);
  27. }
  28. }

多实现带来的隐患:

  1. interface IMessage{
  2. public static final String INFO = "111";
  3. public abstract String getInfo();
  4. }
  5. interface IChannel{
  6. public abstract boolean connect();
  7. }
  8. class MessageImpl implements IMessage,IChannel{
  9. public String getInfo(){
  10. if (this.connect()) {
  11. return "消息已经成功发送";
  12. }
  13. else {
  14. return "通道获取失败,无法获取消息";
  15. }
  16. }
  17. public boolean connect(){
  18. return true;
  19. }
  20. }
  21. class Untitled {
  22. public static void main(String[] args) {
  23. IMessage msg = new MessageImpl();
  24. IChannel chn = (IChannel)msg;//两个不相关的接口通过实现的类互相转换成功。
  25. System.out.println(chn.connect());
  26. }
  27. }

由于MessageImpl子类实现了IMessage和Ichannel两个接口,所以两个接口互相转化。
在java中接口不允许继承父类,所以接口绝对不会是Object的子类,但是MessageImpl是Object的子类,所以接口一定可以通过Object接收。

  1. class Untitled {
  2. public static void main(String[] args) {
  3. IMessage msg = new MessageImpl();
  4. Object obj = msg;
  5. IChannel chn = (IChannel)obj;
  6. System.out.println(chn.connect());
  7. }
  8. }

Object对象可以接收所有数据类型,包括基本数据类型、类对象、接口对象、数组。
由于接口描述的是一个公共定义的标准,所以接口之中所有的抽象方法的访问权限都为public,所以写于不学都一样。
接口可以多继承:

  1. interface IMessage{
  2. public static final String INFO = "111";
  3. public abstract String getInfo();
  4. }
  5. interface IChannel{
  6. public abstract boolean connect();
  7. }
  8. interface server extends IMessage,IChannel{
  9. public String service();
  10. }
  11. class MessageImpl implements server{
  12. //实现接口需要实现全部的方法,包括被server继承的接口。
  13. public String getInfo(){
  14. if (this.connect()) {
  15. return "消息已经成功发送";
  16. }
  17. else {
  18. return "通道获取失败,无法获取消息";
  19. }
  20. }
  21. public boolean connect(){
  22. return true;
  23. }
  24. public String service(){
  25. return "= =";
  26. }
  27. }

在实际的开发之中,接口的使用往往有三种形式:
1.进行标准设置
2.表示一种操作的能力
3.暴露远程方视图,这个一般在RPC分布式开发中使用。

接口定义加强:

接口不当设计:

接口追加方法,且继承的子类数量繁杂。此时在所有的子类中都需要增加方法的覆写。
解决方法:往往子类不是直接实现接口,而是在中间加一个抽象类。抽象类实现接口,子类继承抽象类。这种方案在JDK1.8之后,为了解决接口设计的缺陷,允许接口中定义普通方法。

  1. interface IMessage{
  2. public static final String INFO = "111";
  3. public abstract String getInfo();
  4. public default boolean connect(){//接口中的普通方法必须加default
  5. return true;
  6. }
  7. public static Imessage getInstance(){
  8. return new MessageImpl();
  9. }
  10. }
  11. class MessageImpl implements IMessage{
  12. public String getInfo(){
  13. if (this.connect()) {
  14. return "消息已经成功发送";
  15. }
  16. else {
  17. return "通道获取失败,无法获取消息";
  18. }
  19. }
  20. }
  21. class Untitled {
  22. public static void main(String[] args) {
  23. IMessage msg = new MessageImpl();
  24. System.out.println(msg.getInfo());
  25. }
  26. }

接口中加static方法:

  1. interface IMessage{
  2. public static final String INFO = "111";
  3. public abstract String getInfo();
  4. public default boolean connect(){
  5. return true;
  6. }
  7. public static IMessage getInstance(){
  8. return new MessageImpl();
  9. }
  10. }
  11. class MessageImpl implements IMessage{
  12. public String getInfo(){
  13. if (this.connect()) {
  14. return "消息已经成功发送";
  15. }
  16. else {
  17. return "通道获取失败,无法获取消息";
  18. }
  19. }
  20. }
  21. class Untitled {
  22. public static void main(String[] args) {
  23. IMessage msg = IMessage.getInstance();
  24. System.out.println(msg.getInfo());//消息已经成功发送
  25. }
  26. }

使用接口定义标准:

生活中有许多接口:例如USB、PCIE。电脑只承认USB接口,不关心USB后面的设备是U盘、键盘还是打印机。
指定标准样例:

  1. interface IUSB{
  2. public boolean check();
  3. void work();
  4. }
  5. class Compute{
  6. public void plugin(IUSB usb){
  7. if (usb.check()) {
  8. usb.work();
  9. }
  10. else {
  11. System.out.println("error");
  12. }
  13. }
  14. }
  15. class KeyBoard implements IUSB{
  16. public boolean check(){
  17. return true;
  18. }
  19. public void work(){
  20. System.out.println("working");
  21. }
  22. }
  23. class Print implements IUSB{
  24. public boolean check(){
  25. return false;
  26. }
  27. public void work(){
  28. System.out.println("working");
  29. }
  30. }
  31. class Untitled {
  32. public static void main(String[] args) {
  33. Compute cmp = new Compute();
  34. cmp.plugin(new Print());
  35. cmp.plugin(new KeyBoard());
  36. }
  37. }

接口与抽象类的区别:
No 区别 抽象类 接口
1 定义关键字 abstract class 名称{} interfame 接口名称{}
2 组成 构造、普通方法、静态方法、全局变量、普通方法 抽象方法
3 权限 各种权限 只能使用public
4 子类使用 extends关键字,单一继承 implements关键字,可以多个继承
5 两者关系 抽象类可以实现若干接口 接口不允许继承抽象类,但是允许继承多个父接口。
6 使用 1、抽象类或接口必须定义子类
2、子类一定要覆写抽象类或接口的全部抽象方法
3、通过自雷的向上转型实现抽象类活接口对象实例化

当抽象类和接口都可以使用的情况下,优先考虑接口。