在Java中,除了可以使用抽象类来实现一定程度的抽象外,还可以定义一种特殊的“抽象类”----接口(interface)。
接口是方法声明和常量值的定义的集合。在抽象类中,有些方法被实现,而有些方法只有方法的声明,没有方法的具体实现(抽象方法),而在接口中,所有的方法都没有被实现。和抽象类中的抽象方法不一样,这些没有被实现的方法不需要加上关键字abstract来将它声明为抽象方法。
接口的定义
和类定义不同,接口的定义不使用关键字“class”,而是用另外一个关键字“interface”,接口定义的基本格式如下:
<modifier> interface <name>[extends <superinterface>] {
[<attribute_declarations>]
[<abstract_method_declarations>]
}
在接口中,也可以定义属性,但它的成员属性都会被自动加上public、static和final,而对于接口中的方法,也会自动将它设置为public的。虽然我们可以显式的在属性前面加上public static final来修饰它,或者在方法定义前加上public来修饰,但在Java编程规范中,并不推荐这样做。
我们来看一个接口的定义。
public interface VideoDevice {
public int MIN_BRIGHTNESS = 10;
void turnOn();
void turnOff();
}
在这个接口中,定义了一个接口属性:MIN_BRIGHTNESS,用来表示最小亮度;定义了两个方法:用于表示开机的trurnOn()和用于表示关机的turnOff()。在前面我们说过,接口的属性将会被自动加上public static final修饰,所以,我们写一个应用程序来验证它:
源文件:TestVideoDevice.java
public class TestVideoDevice {
public static void main(String[] args) {
System.out.println(VideoDevice.MIN_BRIGHTNESS);
}
}
在这个类的main()方法中,直接使用“接口.属性名称”来访问接口的方法,我们将它编译并运行,将向控制台打印出如下的信息:
10
它就是接口中我们定义的属性“MIN_BRIGHTNESS”的值。从中也可以看出,接口的属性确实已经被加上了“public static”关键字。
那么,如何验证它还被自动加上了“final”关键字呢?很简单,只需要在TestVideoDevice的main()方法中写一条语句,试图修改MIN_BRIGHTNESS的值,看看会发生什么结果就可以了:
VideoDevice.MIN_BRGHTNESS = 100;
重新编译这个程序,将会出现如下的错误:
TestVideoDevice.java:5: cannot assign a value to final variable MIN_BRIGHTNESS
VideoDevice.MIN_BRIGHTNESS = 100;
^
1 error
很显然,属性MIN_BRIGHTNESS确实已经被加上了“final”修饰符。
接口的继承
接口和类类似,也可以从一个父接口中派生。接口的继承也是使用“extends”关键字来完成。
接口继承的基本语法如下:
<modifier> interface <name>
[ extends <super_interface> ,<super_interface>]{
[<attribute_declarations>]
[<abstract_method_declarations>]
}
和类继承类似,继承的接口也具有了父接口的特性。和类的继承不同的是,在接口的继承中,可以继承多个接口,只需要将继承的各个接口用逗号“,”隔开就可以了。
下面我们来看一个接口继承的例子。
假设我们需要定义一个视听设备,它应该同时具有可视化设备VideoDevice的特性,又有可发声设备AudioDevice的特性,我们就可以将这个视听设备同时继承VideoDevice和AudioDevice:
在前面的例子中,我们已经定义了VideoDevice接口,所以,在这里我们还需要定义一个AudioDevice接口:
public interface AudioDevice {
public int MIN_VOLUME = 5;
void turnOn();
void turnOff();
void tuneVolume(int volume);
}
然后,我们来定一个接口“AVDevice”,让它同时继承接口“VideoDevice”和“AudioDevice”:
public interface AVDevice extends VideoDevice,AudioDevice{
void shiftChannel();
}
除了从“AudioDevice”和“VideoDevice”继承的方法外,在这里新增了一个方法:shiftChannel()。
现在,我们可能会对Java中的继承方式会有了更深的了解:所谓Java不支持多继承,指的是不支持类的多继承。
使用接口
对于抽象类,我们在子类中用“extends”来继承它。但是,对于接口,在子类中必须要用另外一个关键字“implements”来“实现”它。
一个“实现”了接口的类,必须将它实现的接口中的方法都实现,或者,将没有实现的方法定义为抽象的方法,此时,类也必须定义为抽象类。
类实现接口的语法格式如下:
<modifier> class <name> [ extends <superclass> ]
[implements <interface> [,<interface>]* ] {
<declarations> *
}
在Java中,一个类只能继承一个父类,也就是说,Java不支持多继承。但是,一个类可以实现多个接口。通过接口,可以模拟实现多继承。
一个类可以继承一个父类,并且同时实现一个或多个接口。在多个接口之间用“,”来分割开。
我们来看一个实现接口的例子。
interface Metal{
public void twinkle();
}
在这里定义了一个“金属”的接口:Metal,在这个接口中,有一个方法:twinkle(),用来表示金属的闪光光泽。
源文件:Substitution.java
interface Substitution{
public void exchange();
}
这里定
义的是一个“交换物”的接口,这个接口只声明了一个方法:exchange(),用来表示等价交换。
public class Gold implements Substitution, Metal {
/**
* 实现Substitution的exchange()方法
*/
public void exchange() {
System.out.println("Exchange");
}
/**
* 实现Metal中的方法
*/
public void twinkle() {
System.out.println("Shining");
}
public static void main(String args[]) {
Gold gold = new Gold();
gold.exchange();
gold.twinkle();
}
}
然后我们定义了一个“黄金”类用来表示黄金这个实体。黄金同时具有“金属”和“等价交换物”的特点,在这边我们同时实现了“Metal”和“Substitution”这两个接口,然后,在这个类中将两个接口中的方法实现。这样,就实现了“多继承”的功能。
提示:
实现接口的时候必须在实现的方法前面加上public,这是因为在接口中默认的方法修饰符是public。
分享到:
相关推荐
通常使用MPI(多点接口)或以太网接口实现。通过编程,用户可以配置通讯协议,如S7通信或TCP/IP,实现数据交换。 在调试阶段,用户可以通过SIMATIC STEP 7 Basic的模拟功能预览程序运行效果,检查逻辑错误。一旦...
数字电路74全系列(270个)芯片手册技术手册数据手册资料合集: 7400.pdf 7401.pdf 7402.pdf 7403.pdf 7404.pdf 7406.pdf 7408.pdf 7409.pdf 7410.pdf 7411.pdf 74121.pdf 74132.pdf 7414.pdf 74153.pdf 74155.pdf ...
1. **API参考**:MSDN提供了Windows API的详细文档,包括函数原型、参数说明、返回值和使用示例,帮助开发者理解和使用系统接口。 2. **类库文档**:涵盖了MFC和ATL的类和成员函数,以及.NET框架的相关信息。 3. *...
《PyPI官网下载的"cdktf-cdktf-provider-azurerm-0.3.74.tar.gz"——Python库的深度解析》 在Python的生态系统中,PyPI(Python Package Index)是广大开发者获取和分享软件包的重要平台。资源"cdktf-cdktf-...
这通常意味着Kodexa提供了API接口,使得开发者能够方便地在他们的Python项目中集成和使用其功能。 在"压缩包子文件的文件名称列表"中,只有"kodexa-4.0.74"这一项,这可能包含解压后的源代码文件、README、LICENSE...
在实际应用中,mbed-devices库可以帮助开发者轻松管理与mbed硬件相关的任务,例如读写GPIO、I2C、SPI等接口,控制ADC和DAC,甚至与无线通信模块交互。通过Python的简洁语法,开发者可以专注于应用程序逻辑,而无需...
gSOAP 2.8.74是该软件的一个特定版本,包含了对最新SOAP标准的支持以及一些性能优化和错误修复。 **C++ WebService开发**:C++是一种强大的系统编程语言,用于构建高性能的软件应用。在Web Service开发中,C++可以...
《Python库amaasinfra-0.2.74:深入解析与应用》 在IT行业中,Python作为一种强大的、广泛使用的编程语言,拥有丰富的库支持,极大地拓展了其功能和应用场景。今天我们将聚焦于一个名为"amaasinfra"的Python库,...
Chromedriver是一个由Google Chrome团队开发的自动化测试工具,它允许开发者通过Selenium WebDriver接口来控制Chrome浏览器。Selenium WebDriver是一种跨平台的API,用于编写自动化测试脚本,模拟用户在网页上的各种...
3. **开发调试器接口**:SDK还包含了与IDAPRO调试器交互的接口,开发者可以构建与第三方调试器的集成,或者实现自定义的调试协议。 4. **逆向工程工具**:除了基本的反汇编功能,SDK还允许开发者构建各种辅助工具,...
这个名为"74.基于51单片机的实时时钟设计(仿真).rar"的压缩包文件,显然包含了与使用51单片机进行实时时钟设计相关的学习材料或毕业设计项目。下面我们将深入探讨这一主题,了解如何利用51单片机实现一个实时时钟...
此外,该库还支持与其他天文软件的接口集成,使得数据共享和协同研究变得简单高效。 接下来,我们关注一下与“zookeeper”、“分布式”和“云原生”相关的标签。这暗示了pysme-astro可能在大规模分布式系统或云环境...
安装完成后,开发者可以在自己的项目中导入并使用库提供的接口,如创建和配置Pinpoint客户端,然后调用发送短信或语音消息的方法。 例如,要发送一条短信,可以编写如下代码: ```python import boto3 from mypy_...
**Java Development Kit (JDK) 1.8.0 for Linux x86 1.8.0_74** JDK 1.8.0 是Java编程语言的一个关键版本,它在2015年发布,是Oracle公司提供的Java开发工具包。这个版本主要面向Linux x86平台,为开发者提供了在32...
微型计算机接口技术汇编.pdf 中的知识点涵盖了微型计算机接口技术的定义、接口的基本任务、接口中的信息类型、接口中的设备选择功能、接口中的数据缓冲功能、接口中的可编程功能、计算机与外设之间的数据传送方式、...
【74cmsSEv3.27.0.zip】是一个包含个人学习资源的压缩包,主要涉及的技术领域是Java、前端开发以及网络技术。在这个压缩包中,我们可以找到三个主要的文件:`vuecode`、`upload`和`README.md`。 首先,`vuecode`...
使用百度地图API74.zip”表明这是一个关于微信小程序的示例项目,主要用于展示如何在小程序中实现天气预报功能,并且它利用了百度地图的API版本74。这个项目可能包含代码、配置文件和其他资源,帮助开发者了解如何将...
M.2,全称为Next Generation Form Factor (NGFF),是一种小巧、高性能的接口标准,广泛应用于固态硬盘(SSD)、无线网卡等扩展模块。它取代了以往的mSATA标准,为移动设备和轻薄型计算机提供了更加紧凑且高速的数据...
它们具有强大的处理能力和丰富的通讯接口,支持多种通信协议。 2. **Profinet**:Profinet是基于以太网的工业自动化通信标准,它提供了实时性、确定性和灵活性,适用于工厂自动化和过程自动化。Profinet支持I/O通信...