CodeGym /课程 /Java 核心 /接口并不只是接口而已。它还是一种行为。

接口并不只是接口而已。它还是一种行为。

Java 核心
第 2 级 , 课程 8
可用

“你好,阿米戈!还是我。我想让换个角度向你介绍接口。你看,大多数情况下,类是一个特定对象的模型。通过比较,接口更像是对象的能力或角色,而不是对象本身。”

接口并不只是接口而已。它还是一种行为。 - 1

例如,汽车、自行车、摩托车和车轮就是类和对象最好的例子。但是它们的能力,例如“我可以移动”,“我可以载人”,以及“我可以停放”则可以理解为接口。请考虑以下示例:

Java 语言代码 说明
interface Moveable
{
void move(String newAddress);
}
相当于移动能力。
interface Driveable
{
void drive(Driver driver);
}
— 相当于移动能力。
interface Transport
{
void addStuff(Object stuff);
Object removeStuff();
}
— 相当于载货能力。
class Wheel implements Moveable
{
...
}
— 车轮 (Wheel) 类。有移动能力。
class Car implements Moveable, Drivable, Transport
{
...
}
— 汽车 (Car) 类。有移动能力,可以由人类驾驶并装载货物。
class Skateboard implements Moveable, Driveable
{
...
}
— 滑板 (Skatebaord) 类。有移动能力,可以由人类控制。

接口可以让程序员的生活轻松许多。程序经常有成千上万的对象,成百上千的类,和多个接口(角色)。角色数量不多,但它们的组合方式(类)可以有很多种。

重点就是你不需要写代码去定义与其他类的交互。你唯一要做的就是定义与角色(接口)的交互。

假如你是一个机器人制造师。你手下有很多机器人,每个机器人都掌握了多项技能。假如你急需要砌墙。你只要召集所有掌握 build(砌墙)技能的机器人,命令它们去砌墙。你不用去关心具体是哪个机器人去砌墙。即使它是个机器喷水壶,只要它会砌墙,就派它去。

下面就是它在代码里的工作原理:

Java 语言代码 说明
static interface WallBuilder
{
void buildWall();
}
— 能够“砌墙 (build a wall)”。理解“砌墙 (build a wall)”命令(有合适的方法)。
static class WorkerRobot implements WallBuilder
{
void buildWall()
 {
…
 }
}
static class GuardRobot implements WallBuilder
{
void buildWall()
 {
…
 }
}
static class WateringCan
{
…
}
— 有此技能的机器人。

— 浇水壶不能砌墙(它不会实施 WallBuilder 接口)。

public static void main(String[] args)
{
 //add all robots to a list
 ArrayList robots = new ArrayList();
 robots.add(new WorkerRobot());
 robots.add(new GuardRobot());
 robots.add(new WateringCan());

 //build a wall if you can
 for (Object robot: robots)
 {
  if (robot instanceof WallBuilder)
  {
   WallBuilder builder = (WallBuilder) robot;
   builder.buildWall();
   }
  }
 }
}
— 我们如何下达砌墙命令?

“听上去很有趣。我从没想过接口是如此有趣的话题。”

“不止这样!如果再加上多态,效果会更令人震撼。”

评论 (4)
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION
Super Ego 级别 14,Wu Han,China
8 三月 2023
喔喔,我一直在想抽象类和接口有啥区别。 其实说多重继承呀,低版本interface不能写非抽象方法呀啥的,没意思。更应关注为啥抽象类设计上就不允许上面两点,而设计接口这概念来变相规避。我觉得作为学员也好,面试官也好,如果问/被问抽象类和接口的区别,或者说A和B的区别这些个问题,心中的答案应该是这俩为啥这么设计,且为啥只在Java里这么设计。我觉得这才有价值。 其实这节讲这个问题就很贴脸,讲了一个原因。说小点,是代码的可读性。说大点,是代码和现实的相关性。“类”这个东西本就用于指代具有某一类共性的事物,是名词,就不应该再去指代这共性本身,即“功能”这些类似形容词的概念,否则就是一词二义。其它语言都用脱离类的函数,方法之类描述这样的概念,然后用类去方便地调用他们。可java这边所有的代码都在类里面,根本不存在脱离类的方法。上面也说过,如果用类去当这个包袱皮是不合适的,所以这一块其实是缺的。 也就是说,接口的诞生其实是来对标其它语言中“函数”的概念。它和抽象类就类似形容词和名词,比起并列关系,称呼为从属关系更为恰当。
Qin-1999 级别 22
9 一月 2024
一个类实现了一个或多个接口。它不是继承某个类的方法,也不是类似多重继承了好几个带有方法的类,而是表示该类遵循了某个或者某些接口的规范
Bob 级别 20,伯明翰,美国
4 七月 2022
在idea里用Alt+insert可以快速重写
To be brave #10900452 级别 14,Пекин,China
21 一月 2022
如何下达砌墙命令 这个例子很好