`
liuwei1981
  • 浏览: 769213 次
  • 性别: Icon_minigender_1
  • 来自: 太原
博客专栏
F8258633-f7e0-30b8-bd3a-a0836a5f4de5
Java编程Step-by...
浏览量:160469
社区版块
存档分类
最新评论

74.接口

 
阅读更多

在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。

 

分享到:
评论

相关推荐

    MW_SMART_V02.02.00.00_01.74.00.01.rar

    通常使用MPI(多点接口)或以太网接口实现。通过编程,用户可以配置通讯协议,如S7通信或TCP/IP,实现数据交换。 在调试阶段,用户可以通过SIMATIC STEP 7 Basic的模拟功能预览程序运行效果,检查逻辑错误。一旦...

    数字电路74全系列(270个)芯片手册技术手册数据手册资料合集.zip

    数字电路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 ...

    VC++6.0 MSDN (精简版 大小:74.87M).rar

    1. **API参考**:MSDN提供了Windows API的详细文档,包括函数原型、参数说明、返回值和使用示例,帮助开发者理解和使用系统接口。 2. **类库文档**:涵盖了MFC和ATL的类和成员函数,以及.NET框架的相关信息。 3. *...

    PyPI 官网下载 | cdktf-cdktf-provider-azurerm-0.3.74.tar.gz

    《PyPI官网下载的"cdktf-cdktf-provider-azurerm-0.3.74.tar.gz"——Python库的深度解析》 在Python的生态系统中,PyPI(Python Package Index)是广大开发者获取和分享软件包的重要平台。资源"cdktf-cdktf-...

    PyPI 官网下载 | kodexa-4.0.74.tar.gz

    这通常意味着Kodexa提供了API接口,使得开发者能够方便地在他们的Python项目中集成和使用其功能。 在"压缩包子文件的文件名称列表"中,只有"kodexa-4.0.74"这一项,这可能包含解压后的源代码文件、README、LICENSE...

    PyPI 官网下载 | mbed-devices-1.0.0b74.tar.gz

    在实际应用中,mbed-devices库可以帮助开发者轻松管理与mbed硬件相关的任务,例如读写GPIO、I2C、SPI等接口,控制ADC和DAC,甚至与无线通信模块交互。通过Python的简洁语法,开发者可以专注于应用程序逻辑,而无需...

    gsoap_2.8.74.zip

    gSOAP 2.8.74是该软件的一个特定版本,包含了对最新SOAP标准的支持以及一些性能优化和错误修复。 **C++ WebService开发**:C++是一种强大的系统编程语言,用于构建高性能的软件应用。在Web Service开发中,C++可以...

    Python库 | amaasinfra-0.2.74.tar.gz

    《Python库amaasinfra-0.2.74:深入解析与应用》 在IT行业中,Python作为一种强大的、广泛使用的编程语言,拥有丰富的库支持,极大地拓展了其功能和应用场景。今天我们将聚焦于一个名为"amaasinfra"的Python库,...

    74.03.3729.10 的chromedriver和浏览器.zip

    Chromedriver是一个由Google Chrome团队开发的自动化测试工具,它允许开发者通过Selenium WebDriver接口来控制Chrome浏览器。Selenium WebDriver是一种跨平台的API,用于编写自动化测试脚本,模拟用户在网页上的各种...

    idasdk74.zip

    3. **开发调试器接口**:SDK还包含了与IDAPRO调试器交互的接口,开发者可以构建与第三方调试器的集成,或者实现自定义的调试协议。 4. **逆向工程工具**:除了基本的反汇编功能,SDK还允许开发者构建各种辅助工具,...

    74.基于51单片机的实时时钟设计(仿真).rar

    这个名为"74.基于51单片机的实时时钟设计(仿真).rar"的压缩包文件,显然包含了与使用51单片机进行实时时钟设计相关的学习材料或毕业设计项目。下面我们将深入探讨这一主题,了解如何利用51单片机实现一个实时时钟...

    PyPI 官网下载 | pysme-astro-0.4.74.tar.gz

    此外,该库还支持与其他天文软件的接口集成,使得数据共享和协同研究变得简单高效。 接下来,我们关注一下与“zookeeper”、“分布式”和“云原生”相关的标签。这暗示了pysme-astro可能在大规模分布式系统或云环境...

    PyPI 官网下载 | mypy-boto3-pinpoint-sms-voice-1.17.74.tar.gz

    安装完成后,开发者可以在自己的项目中导入并使用库提供的接口,如创建和配置Pinpoint客户端,然后调用发送短信或语音消息的方法。 例如,要发送一条短信,可以编写如下代码: ```python import boto3 from mypy_...

    jdk1.8.0(linux_x86_1.8.0_74).tar.gz

    **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

    微型计算机接口技术汇编.pdf 中的知识点涵盖了微型计算机接口技术的定义、接口的基本任务、接口中的信息类型、接口中的设备选择功能、接口中的数据缓冲功能、接口中的可编程功能、计算机与外设之间的数据传送方式、...

    74cmsSEv3.27.0.zip

    【74cmsSEv3.27.0.zip】是一个包含个人学习资源的压缩包,主要涉及的技术领域是Java、前端开发以及网络技术。在这个压缩包中,我们可以找到三个主要的文件:`vuecode`、`upload`和`README.md`。 首先,`vuecode`...

    微信小程序demo:天气预报;使用百度地图API74.zip

    使用百度地图API74.zip”表明这是一个关于微信小程序的示例项目,主要用于展示如何在小程序中实现天气预报功能,并且它利用了百度地图的API版本74。这个项目可能包含代码、配置文件和其他资源,帮助开发者了解如何将...

    M.2.rar_M.2引脚定义_m.2 PCB规格_m.2有多少引脚_m.2规范_m5293引脚

    M.2,全称为Next Generation Form Factor (NGFF),是一种小巧、高性能的接口标准,广泛应用于固态硬盘(SSD)、无线网卡等扩展模块。它取代了以往的mSATA标准,为移动设备和轻薄型计算机提供了更加紧凑且高速的数据...

    西门子工业网络通信例子程序74.zip

    它们具有强大的处理能力和丰富的通讯接口,支持多种通信协议。 2. **Profinet**:Profinet是基于以太网的工业自动化通信标准,它提供了实时性、确定性和灵活性,适用于工厂自动化和过程自动化。Profinet支持I/O通信...

Global site tag (gtag.js) - Google Analytics