实施接口
上一篇我们了解到 private
关键字封装了对象的内部成员。经过封装,产品隐藏了内部细节,只提供给用户 接口(interface)。
接口是非常有用的概念,可以辅助我们的抽象思考。在现实生活中,当我们想起某个用具的时候,往往想到的是该用具的功能性接口。
比如杯子,我们想到加水和喝水两个功能,高于想到杯子的材质和价格。也就是说,一定程度上,用具的接口等同于用具本身。内部细节则在思考过程中被摒弃。
在 public
和 private
的封装机制,我们实际上同时定义了类和接口,类和接口混合在一起。
Java 提供了 interface
这一语法。这一语法将接口从类的具体定义中剥离出来,构成一个独立的主体。
interface(接口)
以杯子为例,定义一个杯子的接口:
interface Cup {
void addWater(int w);
void drinkWater(int w);
}
Cup 这个 interface 中定义了两个方法的原型(stereotype):addWater()
和 drinkWater()
。规定了 方法名,参数列表 和 返回类型。原型可以告诉外部如何使用这些方法。
在 interface
中,我们
- 不需要定义方法的主体
- 不需要说明方法的可见性
注意第二点,interface
中的方法默认为 public
。正如我们在封装与接口中讲到的,一个类的 public
方法构成了接口。所以,所有出现在 interface
中的方法都默认为 public
。
现在我们可以在一个类的定义中把刚才定义的接口具体实施,比如下面的 MusicCup
(可以播放音乐的杯子):
interface Cup
{
void addWater(int w);
void drinkWater(int w);
}
class MusicCup implements Cup
{
public void addWater(int w) // 加水
{
this.water = this.water + w;
}
public void drinkWater(int w) // 喝水
{
this.water = this.water - w;
}
public int waterContent() // 返回当前水量
{
return this.water;
}
private int water = 0;
}
public class Test
{
public static void main(String[] args)
{
MusicCup newCup = new MusicCup();
newCup.addWater(10);
System.out.println(newCup.waterContent());
}
}
输出结果:
10
我们用 implements
关键字来实施 interface
。
一旦在类中实施了某个 interface
,必须在该类中定义 interface
中的所有方法(本例中是 addWater()
和 drinkWater()
)。且类中的方法需要与 interface
中的方法数据类型相符。否则,Java 将报错。
在类中还可以定义 interface
没有提及的其他 public
方法,比如本例中的 waterContent()
。也就是说,interface
规定了一个必须要实施的最小接口。
实施多个接口
一个类可以实施不止一个的 interface
。我们要造一个可以播放音乐的杯子,可是上例中我们只实现了和水相关的功能,下面我们来让杯子具有音乐相关的功能。
所以 MusicCup
应该具备两套接口,即同时实施 MusicPlayer
接口和 Cup
接口:
// 定义杯子接口
interface Cup
{
void addWater(int w);
void drinkWater(int w);
}
// 定义音乐播放器接口
interface MusicPlayer
{
void play();
}
class MusicCup implements Cup, MusicPlayer
{
public void addWater(int w)
{
this.water = this.water + w;
}
public void drinkWater(int w)
{
this.water = this.water - w;
}
public int waterContent()
{
return this.water;
}
public void play() // 实施音乐播放器接口
{
System.out.println("la...la...la");
}
private int water = 0;
}
public class Test
{
public static void main(String[] args)
{
MusicCup newCup = new MusicCup();
newCup.addWater(10);
System.out.println(newCup.waterContent());
newCup.play();
}
}
输出结果:
10
la...la...la