`

Java接口常用方法

    博客分类:
  • JSE
阅读更多

 

接口是实现构件可插入性的关键,可插入构件的关键在于存在一个公用的接口,以及每个构件实现了这个接口。

  什么是接口?

      Java 中的接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。

接口的两种含义:一, Java 接口, Java 语言中存在的结构,有特定的语法和结构;二,一个类所具有的方法的特征集合,是一种逻辑上的抽象。前者叫做“ Java 接口”,后者叫做“接口”。

Java 语言规范中,一个方法的特征仅包括方法的名字,参数的数目和种类,而不包括方法的返回类型,参数的名字以及所抛出来的异常。在 Java 编译器检查方法的重载时,会根据这些条件判断两个方法是否是重载方法。但在 Java 编译器检查方法的置换时,则会进一步检查两个方法(分处超类型和子类型)的返还类型和抛出的异常是否相同。

接口继承和实现继承的规则不同,一个类只有一个直接父类,但可以实现多个接口。

Java 接口本身没有任何实现,因为 Java 接口不涉及表象,而只描述 public 行为,所以 Java 接口比 Java 抽象类更抽象化。

Java 接口的方法只能是抽象的和公开的, Java 接口不能有构造器, Java 接口可以有 public, 静态的和 final 属性。

接口把方法的特征和方法的实现分割开来。这种分割体现在接口常常代表一个角色,它包装与该角色相关的操作和属性,而实现这个接口的类便是扮演这个角色的演员。一个角色由不同的演员来演,而不同的演员之间除了扮演一个共同的角色之外,并不要求其它的共同之处。

 

为什么使用接口?

    两个类中的两个类似的功能,调用他们的类动态的决定一种实现,那他们提供一个抽象父类,子类分别实现父类所定义的方法。

问题的出现: Java 是一种单继承的语言,一般情况下,哪个具体类可能已经有了一个超类,解决是给它的父类加父类,或者给它父类的父类加父类,只到移动到类等级结构的最顶端。这样一来,对一个具体类的可插入性的设计,就变成了对整个等级结构中所有类的修改。

接口是可插入性的保证。

在一个等级结构中的任何一个类都可以实现一个接口,这个接口会影响到此类的所有子类,但不会影响到此类的任何超类。此类将不得不实现这个接口所规定的方法,而其子类可以从此类自动继承这些方法,当然也可以选择置换掉所有的这些方法,或者其中的某一些方法,这时候,这些子类具有了可插入性(并且可以用这个接口类型装载,传递实现了他的所有子类)。

我们关心的不是那一个具体的类,而是这个类是否实现了我们需要的接口。

接口提供了关联以及方法调用上的可插入性,软件系统的规模越大,生命周期越长,接口使得软件系统的灵活性和可扩展性,可插入性方面得到保证。

 

类型

   使用 Java 接口将软件单位与内部和外部耦合起来。使用 Java 接口不是具体的类进行变量的类型声明,方法的返还类型声明,参量的类型声明,以及数据类型的转换。

   在理想的情况下,一个具体的 Java 类应当只实现 Java 接口和抽象 Java 类中声明的方法,而不应当给多余方法。

类型等级结构

Java 接口(以及抽象类)一般用来作为一个类型的等级结构的起点。

如果一个类已经有了一个主要的超类型,那么通过实现一个接口,这个类可以拥有另一个次要的超类型,这种次要的超类型叫做混合类型。

 

Java 接口常用方法

单方法接口

   public interface Actionlistener(){

      public abstract void actionPerformed(ActionEvent event);

   }

  仅且只有一个方法,只有实现了这个接口(重写这个接口中的唯一一个方法),你才有资格去事件监听器列表里注册(参数为 Actionlistener 类型),当事件源变动时,自动调用这个唯一的 actionPerformed 方法 .

标识接口

是没有任何方法和属性的接口。标识接口不对实现它的类有任何语意上的要求,它仅仅表明了实现它的类属于一个特定的类型(传递)。

不推荐过多的使用标识接口。

常量接口

Java 接口来声明一些常量,然后由实现这个接口的类使用这些常量(以前在做画板的时候这么干过)。建议不要模仿这种常量接口的做法。

 

Java 语言类型安全问题

Java 是强类型的语言。这意味着 Java 编译器会对代码进行检查,以确定没一次赋值,每一次方法的调用是符合类型的。如果有任何不相符合的情况, Java 编译器就会给出错误。

类型检查是基于这样一个简单的事实:每一变量的声明都给这个变量一个类型;每一个方法包括构造器的声明都给这个方法的特征。这样一来, Java 编译器可以对任何的表达式推断出一个明显类型, Java 编译器可以基于明显类型对类型进行检查。

Java 语言是类型安全的。这就是说,任何被 Java 编译器接受的合法的 Java 类保证是类型安全的。换言之,在程序运行期间,不会有任何类型的错误。一个 Java 程序根本不可能将一个本来属于一个类型的变量当作另一个类型处理,因此也就不会产生由此而引起的错误。

简单的说, Java 语言依靠三种机制做到了类型安全:编译期间的类型检查,自动的存储管理,数组的边界检查

 

http://java.ccidnet.com/art/3737/20051208/467875_1.html

 

 

 

 

澄清Java 语言接口与继承的本质

chensheng913

    大多数人认为,接口的意义在于顶替多重继承。众所周知Java 没有c++ 那样多重继承的机制,但是却能够实作多个接口。其实这样做是很牵强的,接口和继承是完全不同的东西,接口没有能力代替多重继承,也没有这个义务。接口的作用,一言以蔽之,就是标志类的类别(type of class )。把不同类型的类归于不同的接口,可以更好的管理他们。OO 的精髓,我以为,是对对象的抽象,最能体现这一点的就是接口。为什么我们讨论设计模式都只针对具备了抽象能力的语言(比如c++javac# 等),就是因为设计模式所研究的,实际上就是如何合理的去抽象。(cowboy 的名言是“抽象就是抽去像的部分”,看似调侃,实乃至理)。

  设计模式中最基础的是工厂模式(Factory ),在我最近的一个很简单的应用中,我想尽量的让我的程序能够在多个数据库间移植,当然,这涉及很多问题,单是如何兼容不同DBMSSQL 就让人头痛。我们不妨先把问题简单化,只考虑如何连接不同的数据库。

  假设我有很多个类,分别是Mysql.javaSQLServer.javaOracle.javaDB2.java ,他们分别连接不同的数据库,统一返回一个Connection 对象,并且都有一个close 方法,用于关闭连接。只需要针对你的DBMS ,选择不同的类,就可以用了,但是我的用户他会使用什么数据库?我不知道,我希望的是尽量少的修改代码,就能满足他的需要。我可以抽象如下接口:

package org.bromon.test;
public interface DB
{
  java.sql.Connection openDB(String url,String user,String password);
  void close();
}


  这个接口只定义两个方法,没有任何有实际意义的代码,具体的代码由实作这个接口的类来给出,比如Mysql.java

Package org.bromon.test;
import java.sql.*;
public class Mysql implements DB
{
  private String url=jdbc:mysql:localhost:3306/test;
  private String user=root;
  private String password= ””;
  private Connection conn;
  public Connection openDB(url,user,password)
  {
    // 连接数据库的代码
  }

  public void close()
  {
    // 关闭数据库
  }
}


  类似的当然还有Oracle.java 等等,接口DB 给这些类归了个类,在应用程序中我们这样定义对象:

  org.bromon.test.DB myDB;

  使用myDB 来操作数据库,就可以不用管实际上我所使用的是哪个类,这就是所谓的“开- 闭”原则。但是问题在于接口是不能实例化的,myDB=new DB() ,这样的代码是绝对错误的,我们只能myDB=new Mysql() 或者myDB=new Oracle() 。麻烦了,我还是需要指定具体实例化的是哪个类,用了接口跟没用一样。所以我们需要一个工厂:

package org.bromon.test;
public class DBFactory
{
  public static DB Connection getConn()
  {
    Return(new Mysql());
  }
}


  所以实例化的代码变成:myDB=DBFactory.getConn()

  这就是23 种模式中最基础的普通工厂(Factory) ,工厂类负责具体实例化哪个类,而其他的程序逻辑都是针对DB 这个接口进行操作,这就是“针对接口编程”。责任都被推卸给工厂类了,当然你也可以继续定义工厂接口,继续把责任上抛,这就演变成抽象工厂(Abstract Factory)

  整个过程中接口不负责任何具体操作,其他的程序要连接数据库的话,只需要构造一个DB 对象就OK ,而不管工厂类如何变化。这就是接口的意义---- 抽象。

  继承的概念不用多说,很好理解。为什么要继承呢?因为你想重用代码?这绝对不是理由,继承的意义也在于抽象,而不是代码重用。如果对象A 有一个run() 方法,对象B 也想有这个方法,所以有人就Class B extends A 。这是不经大脑的做法。如果在B 中实例化一个A ,调用ARun() 方法,是不是可以达到同样的目的?如下:

Class B
{
  A a=new A();
  a.run();
}


  这就是利用类的聚合来重用代码,是委派模式的雏形,是GoF 一贯倡导的做法。

  那么继承的意义何在?其实这是历史原因造成的,最开始的OO 语言只有继承,没有接口,所以只能以继承来实现抽象,请一定注意,继承的本意在于抽象,而非代码重用(虽然继承也有这个作用),这是很多Java 烂书最严重的错误之一,它们所造成的阴影,我至今还没有完全摆脱,坏书害人啊,尤其是入门类的,流毒太大。什么时候应该使用继承?只在抽象类中使用,其他情况下尽量不使用。抽象类也是不能实例化的,它仅仅提供一个模版而已,这就很能说明问题。

  软件开发的万恶之源,一是重复代码而不是重用代码,二是烂用继承,尤以c++ 程序员为甚。Java 中取缔多重继承,目的就是制止烂用继承,实是非常明智的做法,不过很多人都不理解。Java 能够更好的体现设计,这是让我入迷的原因之一。

http://www.java-asp.net/java/200511/t_44332.html

分享到:
评论

相关推荐

    Java毕业设计-基于Springboot+Vue旅游网站设计-源码+数据库+使用文档+演示视频(高分项目).zip

    Java毕业设计-基于Springboot+Vue旅游网站设计-源码+数据库+使用文档+演示视频(高分项目).zip本资源中的源码都是经过本地编译过可运行的,评审分达到95分以上。资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有需要的话可以放心下载使用。 Java毕业设计-基于Springboot+Vue旅游网站设计-源码+数据库+使用文档+演示视频(高分项目).zipJava毕业设计-基于Springboot+Vue旅游网站设计-源码+数据库+使用文档+演示视频(高分项目).zipJava毕业设计-基于Springboot+Vue旅游网站设计-源码+数据库+使用文档+演示视频(高分项目).zipJava毕业设计-基于Springboot+Vue旅游网站设计-源码+数据库+使用文档+演示视频(高分项目).zipJava毕业设计-基于Springboot+Vue旅游网站设计-源码+数据库+使用文档+演示视频(高分项目).zipJava毕业设计-基于Springboot+Vue旅游网站设计-源码+数据库+使用文档+演示视频(高分项目).zip

    Music-app-master.zip

    Music-app-master

    基于springboot的权限管理系统.zip

    基于springboot的java毕业&课程设计

    外东洪路中段.m4a

    外东洪路中段.m4a

    基于matlab+Simulink模拟的微电网系统包括包括电源、电力电子设备等+源码+开发文档(毕业设计&课程设计&项目开发)

    基于matlab+Simulink模拟的微电网系统包括包括电源、电力电子设备等+源码+开发文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 项目简介: 这是一个完整的微电网模型,包括电源、电力电子设备、使用MatLab和Simulink的负载和电源模型。该模型基于费萨尔·穆罕默德的硕士论文《微网格建模与仿真》。 什么是微电网 模拟的微电网使用一组电源和负载在与任何集中式电网(宏电网)断开连接的情况下工作,并自主运行,为其局部区域提供电力。该仿真对微电网在稳态下进行建模,以分析其对输入变化的瞬态响应。 此模拟的目的 对系统进行全年模拟,测量负载、产量、电压和频率。 给出简化规划和资源评估阶段的方法。

    MySQL8.4.0 LTS(mysql-server-8.4.0-1debian12-amd64.deb-bundle)

    MySQL8.4.0 LTS(mysql-server_8.4.0-1debian12_amd64.deb-bundle.tar)适用于Debian 12 Linux (x86, 64-bit)

    改进混沌游戏优化(ICgo)matlab代码.zip

    1.版本:matlab2014/2019a/2021a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    基于SpringBoot,SpringCloud的微服务大型在线学习平台实现.zip

    基于springboot的java毕业&课程设计

    圣经投屏软件(5种语言版本)

    圣经投屏软件(5种语言版本)

    基于SpringBoot,Spring Security实现的前后端分离权限管理简易系统.zip

    基于springboot的java毕业&课程设计

    jSP在线教学质量评价系统的设计与实现(源代码)

    在线教学质量评价系统可以方便和全面地收集教师教学工作的数据,提供师生网上评教的评分结果,快速集中收集各方面的评教信息,使教务管理部门能够及时了解教学动态和师资情况,为教务老师提供相关决策支持,为职称评聘提供教学工作质量的科学依据,同时减轻了教务老师的工作量。

    测障测角小车程序+仿真电路DSN文件+设计报告doc.zip

    包含作品的设计论文doc文档+测障测角小车程序+仿真电路DSN文件,可直接修改,适合于电赛备赛、课程设计、毕设参考等。 设计制作了一款具有智能判断功能的小车,功能强大。小车具有以下几个功能:自动避障功能;寻迹功能(按路面的黑色轨道行驶);趋光功能(寻找前方的点光源并行驶到位);检测路面所放置的铁片的个数的功能;计算并显示所走的路程和行走的时间,并可发声发光。作品可以作为大学生学习嵌入式控制的强有力的应用实例。     作品以两电动机为主驱动,通过各类传感器件来采集各类信息,送入主控单元AT89S52单片机,处理数据后完成相应动作,以达到自身控制。电机驱动电路采用高电压,高电流,四通道驱动集成芯片L293D。其中避障采用红外线收发来完成;铁片检测部分采用电感式接近开关LJ18A3-8-Z/BX检测;黑带检测采用红外线接收二极管完成;趋光部分通过3路光敏二极管对光源信号的采集,再经过ADC0809转化为数字信号送单片机处理判别方向。由控制单元处理数据后完成相应动作,实现了无人控制即可完成一系列动作,相当于简易机器人。 关键字:智能控制   蔽障  红外线收发  寻迹行驶  趋光行驶

    基于Python卷积神经网络人脸识别驾驶员疲劳检测与预警系统设计

    1412基于Python卷积神经网络人脸识别驾驶员疲劳检测与预警系统设计毕业源码案例设计 卷积神经网络(Convolutional Neural Networks, CNNs 或 ConvNets)是一类深度神经网络,特别擅长处理图像相关的机器学习和深度学习任务。它们的名称来源于网络中使用了一种叫做卷积的数学运算。以下是卷积神经网络的一些关键组件和特性: 卷积层(Convolutional Layer): 卷积层是CNN的核心组件。它们通过一组可学习的滤波器(或称为卷积核、卷积器)在输入图像(或上一层的输出特征图)上滑动来工作。 滤波器和图像之间的卷积操作生成输出特征图,该特征图反映了滤波器所捕捉的局部图像特性(如边缘、角点等)。 通过使用多个滤波器,卷积层可以提取输入图像中的多种特征。 激活函数(Activation Function): 在卷积操作之后,通常会应用一个激活函数(如ReLU、Sigmoid或tanh)来增加网络的非线性。 池化层(Pooling Layer): 池化层通常位于卷积层之后,用于降低特征图的维度(空间尺寸),减少计算量和参数数量,同时保持特征的空间层次结构。 常见的池化操作包括最大池化(Max Pooling)和平均池化(Average Pooling)。 全连接层(Fully Connected Layer): 在CNN的末端,通常会有几层全连接层(也称为密集层或线性层)。这些层中的每个神经元都与前一层的所有神经元连接。 全连接层通常用于对提取的特征进行分类或回归。 训练过程: CNN的训练过程与其他深度学习模型类似,通过反向传播算法和梯度下降(或其变种)来优化网络参数(如滤波器权重和偏置)。 训练数据通常被分为多个批次(mini-batches),并在每个批次上迭代更新网络参数。 应用: CNN在计算机视觉领域有着广泛的应用,包括图像分类、目标检测、图像分割、人脸识别等。 它们也已被扩展到处理其他类型的数据,如文本(通过卷积一维序列)和音频(通过卷积时间序列)。 随着深度学习技术的发展,卷积神经网络的结构和设计也在不断演变,出现了许多新的变体和改进,如残差网络(ResNet)、深度卷积生成对抗网络(DCGAN)等。

    基于Vue + SpringBoot实现的前后端分离的仿小米商城项目.zip

    基于springboot的java毕业&课程设计

    QKD 协议密钥率的数值评估matlab代码.zip

    1.版本:matlab2014/2019a/2021a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    基于springboot校园社团管理.zip

    基于springboot的java毕业&课程设计

    基于卷积神经网络的城市感知评估.zip

    卷积神经网络(Convolutional Neural Networks, CNNs 或 ConvNets)是一类深度神经网络,特别擅长处理图像相关的机器学习和深度学习任务。它们的名称来源于网络中使用了一种叫做卷积的数学运算。以下是卷积神经网络的一些关键组件和特性: 卷积层(Convolutional Layer): 卷积层是CNN的核心组件。它们通过一组可学习的滤波器(或称为卷积核、卷积器)在输入图像(或上一层的输出特征图)上滑动来工作。 滤波器和图像之间的卷积操作生成输出特征图,该特征图反映了滤波器所捕捉的局部图像特性(如边缘、角点等)。 通过使用多个滤波器,卷积层可以提取输入图像中的多种特征。 激活函数(Activation Function): 在卷积操作之后,通常会应用一个激活函数(如ReLU、Sigmoid或tanh)来增加网络的非线性。 池化层(Pooling Layer): 池化层通常位于卷积层之后,用于降低特征图的维度(空间尺寸),减少计算量和参数数量,同时保持特征的空间层次结构。 常见的池化操作包括最大池化(Max Pooling)和平均池化(Average Po

    课设毕设基于SpringBoot+Vue的医院急诊系统 LW+PPT+源码可运行.zip

    课设毕设基于SpringBoot+Vue的医院急诊系统 LW+PPT+源码可运行.zip

    无人驾驶实战-无人驾驶高精地图

    无人驾驶高精地图,学习无人驾驶高精地图

    企业数据治理之数据存储治理方案.pptx

    企业数据治理之数据存储治理方案

Global site tag (gtag.js) - Google Analytics