MENU

接口又是啥?

• November 17, 2020 • 面向对象编程

如果可以灵活的使用抽象类和接口进行设计的时候,那么就算掌握了面向对象编程思想了,而这学会这一部分是需要实践很多代码量的,所以是一个循序渐进的过程。

啥是接口?

在进行开发过程中,如果需要隐藏一些细节,那么就可以通过接口来描述

接口也可以理解为一个抽象类,比抽象类还“抽象”的类

原始的定义接口之中是只包含有抽象方法与全局常量的抽象类,在jdk1.8之后出现了lambda表达式,所以在之后的接口中,除了抽象方法与全局常量之外,还可以定义普通方法或者静态方法

用interface关键字进行定义

编写规范:由于类与接口名称的定义要求相同,所以为了区分,接口名称前通常加一个大写字母I

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

例子,子类实现接口:

interface IMessage{
    public static String info = "www.yuhang.site";
    public abstract String  getInfo();
}

class MessageImpl implements IMessage{
    @Override
    public String getInfo() {
        return "我得到了网址:www.yuhang.site";
    }
}

public class Main {
  public static void main(String[] args) {
      IMessage iMessage = new MessageImpl();
      System.out.println(iMessage.getInfo());
      System.out.println(IMessage.info);
  }
}

以上就是使用子类实现接口的一个基本实例

它的输出为:

在java类使用的目的是,一个子类可以实现多个接口,就是实现多继承

上述例子实现多个接口:

/**
 * 消息接口
 */
interface IMessage {
    public static String info = "www.yuhang.site";

    public abstract String getInfo();
}

/**
 * 通道接口
 */
interface IChannel {
    /**
     * 消息按发送的通道情况
     */
    public abstract boolean connect();
}

/**
 * 子类实现消息、通道两个接口
 */
class MessageImpl implements IMessage, IChannel {
    @Override
    public String getInfo() { //覆写方法
        if (this.connect()) {
            return "我得到了网址:www.yuhang.site!";
        }
        return "消息通道建立失败!";
    }

    @Override
    public boolean connect() {
        System.out.println("发送通道已经成功建立!");
        return true;
    }
}

public class Main {
    public static void main(String[] args) {
        IMessage iMessage = new MessageImpl();
        System.out.println(iMessage.getInfo());
    }
}

输出结果:

这个时候需要考虑一个实际情况:对象的转型问题

MessageImpl的实例化对象同时是Object类、IChannel接口(抽象类)、IMessage(抽象类)的实例化对象

此时该实例化对象可以实现任何父接口的转换

public class Main {
    public static void main(String[] args) {
        IMessage iMessage = new MessageImpl();
        IChannel iChannel = (IChannel) iMessage;
        System.out.println(iChannel.connect());
    }
}

IMessage和IChannel两个接口类没有关系,一般来说不能强制转换,但是这里真的可以转换

输出如下:

由于MessageImpl子类实现了IMessage与IChannel接口,所以这个实例对象可以是这两个接口之间任意一个子类对象,所以这两个接口实例之间是可以转换的。

那么接口和Object有关系吗?

在java程序里面,接口是不允许去继承父类的,

所以接口不会是Object的子类

但是MessageImpl是Object的子类,所以接口一定可以通过Object接收

public class Main {
    public static void main(String[] args) {
        IMessage iMessage = new MessageImpl();
        IChannel iChannel = (IChannel) iMessage;
        Object obg = iChannel;
        IChannel channel = (IChannel)obg; 
    }
}

这样写都是可以的

记住:

Object类对象可以接收所有数据类型、类对象、接口对象、数组

接口之中的所有的抽象方法的访问权想都为public,写与不写都是一样的,注意复写的时候只能使用public

一个抽象类可以实现多个接口,而一个普通类只能继承一个抽象类并且可以实现多个父接口,但是要求先继承后实现

接口中的abstruct可以省略,抽象类中不可以,由此可见,接口中的方法全部都是抽象方法,但是在jdk1.8之后,接口中可以有非抽象方法(解决接口追加方法),用default修饰

虽然一个借口无法去继承一个父类,但是一个接口可以有多个父接口(extends继承)

在实际的开发中,接口的使用往往有三种形式:

  1. 进行标准设置
  2. 表示一种操作的能力
  3. 暴露远程方法视图,一般在RPC分布式开发中使用

代码编译器:IntelliJ IDEA 2020.02

Archives QR Code Tip
QR Code for this page
Tipping QR Code