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) 类。有移动能力,可以由人类控制。
3
任务
Java 核心, 第 2 级, 课程 8
已锁定
Code entry
Sometimes you don't need to think, you just need to hammer it out! As paradoxical as it may seem, sometimes your fingers will "remember" better than your conscious mind. That's why while training at the secret CodeGym center you will sometimes encounter tasks that require you to enter code. By entering code, you get used to the syntax and assimilate some material. What's more, you combat laziness.

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

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

假如你是一个机器人制造师。你手下有很多机器人,每个机器人都掌握了多项技能。假如你急需要砌墙。你只要召集所有掌握 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
如何下达砌墙命令 这个例子很好