java接口与实现

news2024/12/28 9:19:08

文章目录

  • 一、Java接口
  • 二、Java实现接口
  • 三、Java接口回调
  • 四、Java接口与多态
  • 五、Java接口参数
  • 六、Java接口与抽象类的比较
  • 七、Java接口的UML图
  • 总结

一、Java接口

接口是Java语言中一种重要的数据类型,通常使用关键字interface来定义一个接口。

接口的定义和类的定义十分相似,分为接口声明和接口体,例如:

interface Printable {
    final int MAX=100;
    void add();
    float sum(float x,float y);
}

1. 接口声明:

接口包含有接口声明和接口体,和类不同的是,接口使用关键字interface来声明自己是一个接口,格式如下:

interface 接口的名字

2.接口体:

接口体中包含常量的声明和抽象方法两部分。接口体中只有抽象方法,没有普通方法,而且接口体中所有的常量的访问权限一定都是public,而且是static常量,所有的抽象方法的访问权限一定都是public。

例如:

interface Printable {
    public final static int MAX = 100; //等价写法:int MAX = 100;
    public abstract void add(); //等价写法:void add();
    public abstract float sum(float x,float y);
    //等价写法:float sum(float x,float y);
}

注意:修饰符public、final、static允许省略。

二、Java实现接口

在Java语言中,接口由类来实现,以便使用接口中的方法。一个类需要在类声明中使用关键字implements声明该类实现一个或多个接口。如果实现多个按口,用逗号隔开接口名。

例如:

class A implements Printable,Addable //A类实现Printable和Addable接口
class Dog extends Animal implements Eatable,Sleepable
//Animal的Dog子类实现Eatable和Sleepable接口

如果一个非抽象类实现了某个接口,那么这个类必须重写这个接口中的所有方法。

注意:由于接口中的方法一定是public abstract方法,所以类在重写接口方法时不仅要去掉abstract修饰符,还要给出方法体,而且方法的访问权限一定要明显地用public来修饰。
如果实现接口的非抽象类实现了该接口中的方法,就相当于给出了方法的具体行为功能。用户也可以自定义接口,一个Java源文件可以由类和接口组成。

如果一个类声明实现一个接口,但没有重写接口中的所有方法,那么这个类必须是抽象类,也就是说,抽象类既可以重写接口中的方法,也可以直接拥有接口中的方法。

细节说明:

程序可以用接口名访问接口中的常量,但是如果一个类实现了接口,那么该类可以直接在类体中使用该接口中的常量。

定义接口时,如果关键字interface前面加上public关键字,就称作public接口,public接口可以被任何一个类实现;如果不加上public关键字,就称作友好接口,友好接口可以被与该接口在同一包中的类实现。

如果父类实现了某个接口,那么子类也就自然而然地实现了该接口,也就是说,子类不必再使用关键字implements声明实现这个接口。

接口也是可以被继承的,即可以通过关键字extends声明一个接口是另一个接口的子接口。由于接口中的方法和常量都是共有的,所以子接口将继承父接口中的全部方法和常量。

注意:Java提供的接口都在相应的包中,通过import语句不仅可以引入包中的类,也可以引入包中的接口。

例如:

import java.io.*;
//此时不仅引入了java.io包中的类,还引入了该包中的接口

三、Java接口回调

接口和类一样,也是Java语言中一种重要的数据类型,用接口声明的变量称作接口变量

首先,接口属于引用型变量,接口变量中可以存放实现该接口的类的实例的引用,即存放对象的引用。

例如:假设Com是一个接口,那么就可以用Com声明一个变量。

Com com;

因为com变量中还没有存放实现该接口的对象的引用,所以称此时的com是一个空接口

假设ImpleCom类是实现Com接口的类,用ImpleCom创建名字为object的对象,那么object对象不仅可以调用ImpleCom类中原有的方法,而且也可以调用ImpleCom类实现的接口方法。

ImpleCom object = new ImpleCom();

“接口回调”

在Java语言中,接口回调是指可以把实现某一接口的类创建的对象的引用赋值给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口方法,实际上,当接口变量调用被类实现的接口方法时,就是通知相应的对象调用这个方法。

注意:接口无法调用类中的其他非接口方法。

四、Java接口与多态

由于不同的类在实现同一个接口时可能具有不同的实现方式,所以接口变量在回调接口方法时就可能具有多种形态

接口多态定义的格式:

接口 变量名 = new 接口实现类();

例如:A类和B类都实现了ComputerAverage接口,但实现的方式不同。

interface ComputerAverage {
    public double average(double a,double b);
}
class A implements ComputerAverage {
    public double average(double a,double b) {
        double aver = 0;
        aver = (a+b)/2;
        return aver;
    }
}
class B implements ComputerAverage {
    public double average(double a,double b) {
        double aver = 0;
        aver = Math.sqrt(a*b);
        return aver;
    }
}
public class Main {
    public static void main(String args[]) {
        ComputerAverage computer;
        double a = 10,b = 40;
        computer = new A();
        double result = computer.average(a,b);
        System.out.printf("%5.2f和%5.2f的算术平均值:%5.2f\n",a,b,result);
        computer = new B();
        result = computer.average(a,b);
        System.out.printf("%5.2f和%5.2f的几何平均值:%5.2f",a,b,result);
    }
}

在这里插入图片描述

五、Java接口参数

如果一个方法的参数是接口类型,我们就可以将任何实现该接口的类的实例的引用传递给该接口参数,那么接口参数就可以回调类实现的接口方法

interface SpeakHello {
    void speakHello();
}
class Chinese implements SpeakHello {
    public void speakHello() {
        System.out.println("中国人习惯问候语:你好,吃饭了吗? ");
    }
}
class English implements SpeakHello {
    public void speakHello() {
        System.out.println("英国人习惯问候语:你好,天气不错!");
    }
}
class KindHello {
    public void lookHello(SpeakHello hello) { //接口类型参数
        hello.speakHello(); //接口回调
    }
}
public class Main {
    public static void main(String args[]) {
        KindHello kindHello = new KindHello();
        kindHello.lookHello(new Chinese());
        kindHello.lookHello(new English());
    }
}

在这里插入图片描述

六、Java接口与抽象类的比较

1. Java接口与抽象类的比较

(1) abstract(抽象)类和接口都可以有abstract(抽象)方法。

(2) 接口中只可以有常量,不能有变量,而abstract类中既可以有常量也可以有变量。

(3) abstract类中也可以有非abstract方法,接口不可以。

在设计程序时应当根据具体的分析来确定是使用抽象类还是接口。abstract类除了提供重要的需要子类重写的abstract方法以外,还提供了子类可以继承的变量和非abstract方法。

如果某个问题需要使用继承才能更好地解决,比如:子类除了需要重写父类的abstract方法以外,还需要从父类继承一些变量或继承一些重要的非abstract方法,就可以考虑用abstract类。如果某个问题不需要继承,只是需要若干个类给出某些重要的abstract方法的实现细节,就可以考虑使用接口。

注意:JDK1.8接口支持静态方法和默认方法。

七、Java接口的UML图

表示接口的UML图和表示类的UML图类似,使用一个长方形描述一个接口的主要构成,将长方形垂直地分为三层。

顶部第1层是名字层,接口的名字必须是斜体字形,而且需要用<>修饰名字,并且该修饰和名字分列在两行。

第2层是常量层,列出接口中的常量及类型,格式是“常量名字:类型”。

第3层是方法层,也称操作层,列出接口中的方法及返回类型,格式是“方法名字(参数列表):类型”。

接口Computable的UML图如下:
在这里插入图片描述如果一个类实现了一个接口,那么类和接口的关系是实现关系,称类实现接口。UML通过使用虚线连接类和它所实现的接口,虚线起始端是类,虚线的终点端是它实现的接口,但终点端使用一个空心的三角形表示虚线的结束。

China和Japan类实现Computable接口的UML图如下:
在这里插入图片描述
对于接口的实现参照面向对象的学习可以更好的理解。

学习来自“https://www.dotcpp.com”

总结

晨光熹微,鸟语花香,微风和畅。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/539232.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【22-23 春学期】人工智能基础--AI作业10-经典卷积网络

LeNet & MNIST LeNet是由Yann LeCun及其合作者于1998年开发的一种具有开创性的卷积神经网络架构。它的设计目的是识别手写数字并执行图像分类任务。MNIST是一个用于手写数字识别的大型数据库&#xff0c;常被用于训练图像处理系统。LeNet与MNIST的关系在于&#xff0c;LeNe…

二十六、搜索与图论——SPFA算法(单源最短路 + 负权边 + Bellman-Ford 时间复杂度优化)

SPFA算法主要内容 一、基本思路1、算法概念2、SPFA 算法步骤算法步骤注意事项 3、SPFA算法进行负环判断 二、Java、C语言模板实现SPFA 算法SPFA求负环 三、例题题解 一、基本思路 1、算法概念 概念&#xff1a; SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称&#xff0…

〖大学生·技术人必学的职业规划白宝书 - 职业规划篇⑤〗- 利用职业能力模型拆解目标岗位

历时18个月&#xff0c;采访 850 得到的需求。 不管你是在校大学生、研究生、还是在职的小伙伴&#xff0c;该专栏有你想要的职业规划、简历、面试的答案。说明&#xff1a;该文属于 大学生技术人职业规划白宝书 专栏&#xff0c;购买任意白宝书体系化专栏可加入TFS-CLUB 私域社…

redis高级篇(2)---主从同步

一)搭建主从架构: 单节点Redis的并发能力是有限的&#xff0c;所以说要想进一步提高Redis的并发能力&#xff0c;就需要搭建主从集群&#xff0c;实现读写分离&#xff0c;因为对于Redis来说大部分都是读多写少的场景&#xff0c;更多的要进行读的压力&#xff0c;最基本都要是…

7.Redis管道/流水线

这里写目录标题 是什么&#xff1f;Redis pipelining 案例演示&#xff1a;小总结Pipeline与原生批量命令对比Pipeline与事务对比使用Pipeline注意事项 &#xff08;Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。一个请求会遵循以下步骤&#xff1a; 1 .客户…

[云原生] 破局微服务通信:探索MegaEase服务网格的创新之路

文章目录 [云原生]破局微服务通信&#xff1a;探索MegaEase服务网格的创新之路解析MegaEase&#xff1a;服务网格领域的领先者 1. MegaEase的背景和使命拓展: 2. MegaEase的核心产品&#xff1a;EaseMesha. 动态服务发现与负载均衡b. 弹性和容错机制c. 安全性与身份认证d. 可观…

M^2BEV: 统一的鸟瞰图表示的多相机联合3D检测和分割

文章&#xff1a;M^2BEV: Multi-Camera Joint 3D Detection and Segmentation with Unified Bird’s-Eye View Representation 作者&#xff1a;Enze Xie, Zhiding Yu, Daquan Zhou, Jonah Philion, Anima Anandkumar, Sanja Fidler, Ping Luo, Jose M. Alvarez 编辑&#xff1…

SpringBoot内置Tomcat 配置和切换

目录 SpringBoot内置Tomcat 配置和切换 基本介绍 内置Tomcat 的配置 application.yml配置 对上面代码解释一下方便理解 通过类来配置Tomcat 注销application.yml 对tomcat 配置&#xff0c;完成测试 切换WebServer, 演示如何切换成Undertow 修改pom.xml , 排除tomcat…

sqli_labs17 ——更新注入

输入用户名admin密码随便输入&#xff0c;发现回显提示是成功修改密码&#xff0c;更新就是指的更新密码 想要在用户栏测试闭合&#xff0c;但是都回显的是hacker 利用自己的字典查了一下也全部回显的一样的数据&#xff0c;那说明这个用户栏是设定了严格的过滤的&#xff0c;结…

前端3D技术概述

操作系统、编译原理、计算机图形学被传为程序员的三大浪漫&#xff0c;每个方向都易懂难深&#xff0c;但作为程序员对每个方向还是要有基本的认识和判断&#xff0c;毕竟贯穿虚拟和现实生活的桥梁是搭建在抽象之上的&#xff0c;这三大浪漫是抽象化的课代表。本次我们认识下计…

Spring 五大类注解、方法注解、对象注入简化 Bean 操作

目录 为什么要使用注解 配置扫描文件&#xff1a; 1.配置扫描路径 1. 五大类注解&#xff1a; 五大类注解有哪些&#xff1f; 1.1 Controller&#xff1a; 1.1.1 存储 Bean 1.1.2 读取 Bean 1.2 Service&#xff1a; 1.2.1 存储 Bean 1.2.2 读取 Bean 1.3 Repository&a…

Hadoop的基本概念和架构

Hadoop的基本概念和架构 学习路线 hadoop的基本概念和架构hadoop的安装和配置hadoop的HDFS文件系统hadoop的MapReduce计算框架hadoop的YARN资源管理器hadoop的高级特效&#xff0c;如HBase&#xff0c;Hive&#xff0c;Pig等hadoop的优化和调优hadoop的应用场景&#xff0c;如…

23种设计模式之组合模式(Composite Pattern)

前言&#xff1a;大家好&#xff0c;我是小威&#xff0c;24届毕业生&#xff0c;在一家满意的公司实习。本篇文章将23种设计模式中的组合模式&#xff0c;此篇文章为一天学习一个设计模式系列文章&#xff0c;后面会分享其他模式知识。 如果文章有什么需要改进的地方还请大佬不…

跨平台应用开发进阶(六十三):微信小程序开发

文章目录 一、前言二、开发物料准备2.1 个性化小程序2.2 开发时如何调用API2.3 微信小程序开发常用组件库2.3.1 WeUI2.3.2 Vant Weapp2.3.3 iView Weapp2.3.4 ColorUI2.3.5 Wux Weapp2.3.6 TaroUI2.3.7 MinUI 三、创建一个UNI-APP项目四、进行调试4.1 启动微信开发者工具4.2 调…

网络基础进阶

1、交换机接口类型 Console口&#xff1a;也称为&#xff1a;串口接口&#xff0c;一般用于与PC连接&#xff0c;用于配置和监控交换机。百兆以太网接口&#xff1a;用于连接计算机和交换机之间的通信。Console到的网络接口&#xff1a;俗称交叉串口&#xff0c;是用于连接交换…

Day.js 常用方法

Day.js是一个极简的JavaScript库&#xff0c;可以为现代浏览器解析、验证、操作和显示日期和时间&#xff0c;文件大小只有2KB左右&#xff0c;下载、解析和执行的JavaScript更少。 官网&#xff1a;Day.js中文网 1. 安装 npm install dayjs --save 2.引入 3. 初始化日期 …

基于开源大模型Vicuna-13B构建私有制库问答系统

本教程专注在怎么使用已经开源的模型和项目&#xff0c;构建一个可以私有化部署的问答知识库&#xff0c;而且整体效果要有所保障。 主要工作包括&#xff1a; 选择基础模型&#xff0c;openAI&#xff0c;claude 这些商用的&#xff0c;或者其他的开源的&#xff0c;这次我们…

vue 全局注册--

注册全局-过滤器 filters 的 js 文件 /*** 格式化单位展示* param value* param unit* returns {string}*/const unitFormatter function (value , unit ) {value value || -return value ([, -].includes(value) ? : unit) }export default {unitFormatter }vue -ma…

如何使用ArcGIS进行字段连接

&#xff08;本文首发于“水经注GIS”公号&#xff0c;关注公号免费领取地图数据 当我们的shapefile文件属性表中的数据不够丰富&#xff0c;而Excel表格中的数据很丰富的时候&#xff0c;我们可以通过两个数据之间的共有字段进行连接&#xff0c;这里为大家介绍一下ArcGIS中字…

五、easyUI中的datagrid(数据表格)组件

1.datagrid&#xff08;数据表格&#xff09;组件的概述 datagrid以表格形式展示数据&#xff0c;并提供了丰富的选择、排序、分组和编辑数据的功能支持。datagrid的设计用于缩短开发时间&#xff0c;并且使开发人员不需要具备特定的知识。它是轻量级的且功能丰富&#xff0c;…