![名师讲坛:Java开发实战经典(第2版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/824/26793824/b_26793824.jpg)
6.6 接口的基本概念
接口是Java中最重要的概念之一,接口可以理解为一种特殊的类,里面全部是由全局常量和公共的抽象方法所组成。
【格式6-3 接口的定义格式】
![](https://epubservercos.yuewen.com/DE8B7B/15253389304122106/epubprivate/OEBPS/Images/Figure-P180_124391.jpg?sign=1739284937-RgBrgFa5MOPhqWLMz9JJTCENJcupIktN-0-6192b1df1a166c023cace97f2b177820)
需要注意的是在接口中的抽象方法必须定义成public访问权限,这是绝对不可改变的。
提示
在接口中如果不写public,则也是public访问权限。
在很多的Java程序中,经常看到编写接口方法的时候省略了public,那么就会有很多的读者认为它的访问权限是default,实际上这是错误的,不管写与不写接口中的方法永远是public。
【例6.25】接口的定义
![](https://epubservercos.yuewen.com/DE8B7B/15253389304122106/epubprivate/OEBPS/Images/Figure-P180_124394.jpg?sign=1739284937-MYkHx8wEFHbhDlQIznUqZreCwVO302yO-0-e5537701eb4d9e52049eb4fda344fe9d)
上面的程序定义了一个接口,在这里要提醒读者的是,接口中的基本概念里已经明确地声明了接口是由全局常量和抽象方法组成,所以此处的接口定义可以简化成如下的形式:
![](https://epubservercos.yuewen.com/DE8B7B/15253389304122106/epubprivate/OEBPS/Images/Figure-P180_124398.jpg?sign=1739284937-ARld4H2D2LFYmbYrqpH8fWlsMDu6ZCA3-0-acde951d2ebe8de9764775a07096eaf1)
在程序中接口可以通过图6-11所示的图形表示。
![](https://epubservercos.yuewen.com/DE8B7B/15253389304122106/epubprivate/OEBPS/Images/Figure-P180_124399.jpg?sign=1739284937-4Bwows2W89JCSeaiF3pmox1MW63NMqcu-0-ce1c4a02ea7c5e14119817bd780e61db)
图6-11 接口图形表示
与抽象类一样,接口要使用也必须通过子类,子类通过implements关键字实现接口。
【格式6-4 实现接口】
![](https://epubservercos.yuewen.com/DE8B7B/15253389304122106/epubprivate/OEBPS/Images/Figure-P180_124401.jpg?sign=1739284937-Y3DVvM86aWryhxGD8EnJosYDHjjTkg0Z-0-ad7502878162e442202eb006a32fb03b)
从格式6-3中可以清楚的发现,一个子类可以同时实现多个接口,那么这实际上就摆脱了Java的单继承局限。
【例6.26】实现接口
![](https://epubservercos.yuewen.com/DE8B7B/15253389304122106/epubprivate/OEBPS/Images/Figure-P181_124403.jpg?sign=1739284937-NXkDTEwNvjsmLhufcOtNdK6tz9jGoi1f-0-79cfc8b0ce4348c0bfc7b2cba16dce39)
程序执行结果:
![](https://epubservercos.yuewen.com/DE8B7B/15253389304122106/epubprivate/OEBPS/Images/Figure-P181_124404.jpg?sign=1739284937-ZmHsKb2xPXLIHFFpcPyqvEHMajMJ8nua-0-8459d6b2f78b8f7a9f445bb7598b4112)
上面的程序中,一个子类同时实现了两个接口,这样在子类中就必须同时覆写完两个接口中的全部抽象方法。上面程序的类图如图6-12所示。
![](https://epubservercos.yuewen.com/DE8B7B/15253389304122106/epubprivate/OEBPS/Images/Figure-P181_124405.jpg?sign=1739284937-KtDioK2Unh1hM95ztBy9hYStpR2kZEdh-0-4acb04919f929ef8513338caf682ba49)
图6-12 接口的实现
如果在开发中一个子类既要实现接口又要继承抽象类的话,则可以按照格式6-5进行定义。
【格式6-5 继承抽象类实现接口】
![](https://epubservercos.yuewen.com/DE8B7B/15253389304122106/epubprivate/OEBPS/Images/Figure-P181_124407.jpg?sign=1739284937-giAk3YEQWIe3GXHqXX1UIeOgiDUqnPhL-0-ba65ffd90ed782521dcc518e8d158615)
【例6.27】子类同时继承抽象类和实现接口
![](https://epubservercos.yuewen.com/DE8B7B/15253389304122106/epubprivate/OEBPS/Images/Figure-P182_124409.jpg?sign=1739284937-YBHpEN99QJvXzXxKpijFcUOUFusT9MOB-0-79b96b2001a5cdbb9aeffa5bf02d985e)
程序执行结果:
![](https://epubservercos.yuewen.com/DE8B7B/15253389304122106/epubprivate/OEBPS/Images/Figure-P182_124410.jpg?sign=1739284937-2kyAI1y0ssxadTccOqAYTWHnyd4rrouD-0-cef1195c77bdddffe8760405f2be4d04)
在上面的程序中因为抽象类和接口本身都有抽象方法,所以子类中必须覆写3个抽象方法。另外,在Java中是允许一个抽象类实现多个接口的。
【例6.28】抽象类实现接口
![](https://epubservercos.yuewen.com/DE8B7B/15253389304122106/epubprivate/OEBPS/Images/Figure-P182_124411.jpg?sign=1739284937-5pGkCjcscHlKaJUKzjeXqBDf3S4LrtbX-0-b1458f523b0afe1e7d6177c064de99c0)
程序执行结果:
![](https://epubservercos.yuewen.com/DE8B7B/15253389304122106/epubprivate/OEBPS/Images/Figure-P183_124414.jpg?sign=1739284937-PGdHprkkXjcwEq675YsSRqhcQkkxHPa2-0-75a20dbc2d01e7a15dd4f073c447fc1a)
在上面的程序中,因为抽象类实现了接口,所以在抽象类中就包含了3个抽象方法,这样抽象类的子类就必须同时覆写3个抽象方法,在Java中一个接口是不允许继承抽象类的,但是允许一个接口继承多个接口,如格式6-6所示。
【格式6-6 接口的继承】
![](https://epubservercos.yuewen.com/DE8B7B/15253389304122106/epubprivate/OEBPS/Images/Figure-P183_124415.jpg?sign=1739284937-iDEfoGTml3zZorj8ANP9Gab6FlTTGFA6-0-e7eb695d11a11a0fa6fa55222447ef07)
【例6.29】接口的多继承
![](https://epubservercos.yuewen.com/DE8B7B/15253389304122106/epubprivate/OEBPS/Images/Figure-P183_124416.jpg?sign=1739284937-9SVZkoOMtkWJIWol5t01i7JkKm9P7TMn-0-2ad4e0d1f612fff81383d4360c0e0a64)
程序执行结果:
![](https://epubservercos.yuewen.com/DE8B7B/15253389304122106/epubprivate/OEBPS/Images/Figure-P184_124419.jpg?sign=1739284937-MabYUNQY6FR8S0sczUqVSgBD9hnX0AvH-0-ae3a807f90b79def65f0268bc61f9b48)
从上面的程序中可以发现,接口C继承了接口A和接口B,这样在接口C中就同时存在了3个抽象方法,子类X实现接口C之后就必须同时覆写3个抽象方法。