实施接口

2018-03-12  本文已影响10人  SingleDiego

上一篇我们了解到 private 关键字封装了对象的内部成员。经过封装,产品隐藏了内部细节,只提供给用户 接口(interface)。

接口是非常有用的概念,可以辅助我们的抽象思考。在现实生活中,当我们想起某个用具的时候,往往想到的是该用具的功能性接口。

比如杯子,我们想到加水和喝水两个功能,高于想到杯子的材质和价格。也就是说,一定程度上,用具的接口等同于用具本身。内部细节则在思考过程中被摒弃。

publicprivate 的封装机制,我们实际上同时定义了类和接口,类和接口混合在一起。

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
上一篇下一篇

猜你喜欢

热点阅读