Interface is a broad concept, So to understand it please use multiple perspectives.
中文日:君子不器。

Vision One —— Program design

接口是类的一种扩展,可以以一种居高临下的视野去切入,它很适合以一个管理者(设计者)的角度看待要管理的对象,比如说对于一个招聘者(管理者)来说,他可能需要面试数百个个求职者(被管理的对象),每个求职者的过往经历又是那么的琐碎,种类繁多,想要快速找到一名合适人到合适岗位,招聘者所最关心就是这个人能干什么,基于这个原则,招聘者只需要看他的项目经历即可,而不需要去逐个去了解他的求学经历、家庭信息等。

归纳起来就是,很多场景下我们关心的不是类型,而是能力。我们来看一些生活中的例子:

  • 比如拍照,很多时候,需求者只要能拍出符合需求的照片就行,至于是用手机拍,还是用Pad拍,或者是用单反相机拍,并不重要,即关心的是对象是否有拍出照片的能力,而并不关心对象到底是什么类型,手机、Pad或单反相机都可以。

  • 比如要计算一组数字,需求者只要能计算出正确结果即可,至于是由人心算,用算盘算,用计算器算,用计算机软件算,并不重要,即关心的是对象是否有计算的能力,而并不关心对象到底是算盘还是计算器。

Vision Two —— The operation is unknown

很多场景下,代码并不知道具体的类型,这才是接口发挥威力的地方。
程序在设计时,对未来或者一些陌生的领域是未知的,这种场景下,就需要用到接口。针对接口而非具体类型进行编程,这个也是计算机程序的一种重要思维方式。

vision Three —— Special polymorphism

下面是核心,仔细看

基于前面说的,我们大致知道了接口的功能作用,但是接口是怎么实现这个神奇效果的?这个有没有想过呢?
程序设计原则里,就有一条,依赖倒置原则——依赖抽象接口,而不是具体对象,这又怎么理解呢?

在说接口前,先看看Java类的祖先——Object类,Object类是Java中所有类的根类。它位于java.lang包中,因此不需要显式导入就可以使用(相当于隐式的给你写好了继承语句)。Object类定义了一些通用的方法,这些方法可以在所有其他子类中直接使用。如equals(Object obj)、toString()等。由于Java有继承机制,就产生了多态,就像你定义了一个任意子类,只要重写了toString()方法,就实现了多态,比如下面示例:

Object myCustom = new MyCustom();
String string = myCustom.toString();
System.out.println(string);

即使你定义的类型是Object,但是赋值过去的是子类,去执行的功能也还是子类的。

看来这里,不知道你有没有灵光一闪的感觉!你想象一下,做一下迁移,替换思维,是不是发现接口也是一样的套路,也是这玩意的变种,所以我起了一个名字给他,接口其实就是一种特殊的多态(Special Polymorphism)。

你定义的任意一个接口,其实都和Object父类是一样的高层级。不同点在于,Object需要写一些类都共用的功能,让子类去使用或重写,接口里直接写一些空方法名在哪里即可,因为定义的这些方法就和toString( ) 一样,只等着具体实现者去实现这些方法,接口(类似父类)唯一想要的就是一个多态机制即可。

posted on 2023-08-29 14:53  Mysticbinary  阅读(19)  评论(0编辑  收藏  举报