Java的接口以及接口与抽象类区别

news/2024/4/27 20:27:32/文章来源:https://blog.csdn.net/m0_61820867/article/details/126670491

java的接口

产生的背景

有时候必须从几个类中派生出一个子类,继承他们所有的方法,java不支持多继承,于是就有接口

抽象类中全是抽象方法时,为了简化abstract关键字,于是就有了接口

特点

接口用interface实现

接口中所有的方法默认都是public abstract(不写访问权限修饰符就是默认public abstract)

接口中所有的变量都是public static final修饰的(该变量属于类还是常量,必须初始化)

接口没有构造方法(不能被继承,可以继承其他类),但是可以使用多态(接口和实现类之间)

实现接口的类必须实现接口中所有的方法,除非实现类为抽象类,但是继承了该实现类(抽象类)的类也要实现(重写)接口的所有方法以及实现类中的抽象方法,当然该继承类为抽象类也可以不重写,知道有一个非抽象类的继承为止…

类不会因为实现了接口,就不能继承其他类

java 8之后,接口中可以有默认方法,使用default修饰即可,也就是对方法写方法体了

public interface A {default void run(){System.out.println("A");}}
public class C  implements A,B{@Overridepublic void sleep() {}@Overridepublic void run() {System.out.println("C");}public static void main(String[] args) {C c = new C();c.run();}
}

在这里插入图片描述

与继承关系类似,接口与实现类之间存在多态

AnimalInt接口

public interface AnimalInt {void run();void sleep();void eat();
}

AnimalIntImpl实现类

public class AnimalIntImpl implements AnimalInt{@Overridepublic void run() {System.out.println("动物1跑");}@Overridepublic void sleep() {System.out.println("动物1睡");}@Overridepublic void eat() {System.out.println("动物1吃");}
}

AnimalIntImpl2实现类

public class AnimalIntImpl2 implements AnimalInt{@Overridepublic void run() {System.out.println("动物2跑");}@Overridepublic void sleep() {System.out.println("动物2睡");}@Overridepublic void eat() {System.out.println("动物2吃");}
}

Test测试类

public class Test {public static void main(String[] args) {AnimalInt animalInt1 = new AnimalIntImpl();//使用接口指向实现类,有点类似父类指向子类引用,这里存在多态AnimalInt animalInt2 = new AnimalIntImpl2();animalInt1.eat();animalInt2.eat();}
}

在这里插入图片描述

接口与类之间是实现关系,使用implements关键字表示,(也可以支持多实现)举例:使用implements A,B

接口和接口之间是继承关系,使用extends关键字表示(而且可以多继承)剧烈使用extends A,B可以同时继承A,B接口

为什么接口可以实现多继承,普通的类必须,因为不同的类可以有重复的方法,继承的子类开年不好抉择是那个父类的方法,接口由于完全抽象的特性,其方法都没有实现内容,即使出现重复的方法,也没有关系,实现类选任意一个实现即可

接口D

public interface D {void jump();
}

接口B

public interface B {void sleep();
}

接口A继承于接口B,D(由于接口是抽象类,不需要重写父类的方法)

public interface A extends B,D{void run();}

实现类C 要重写A,B,D的所有(抽象)方法

public class C implements A{@Overridepublic void sleep() {}@Overridepublic void run() {}@Overridepublic void jump() {}
}
接口回调

先有接口调用者,后又接口的实现者

Usb接口

public interface Usb {void service();
}

Computerl类

public class Computer {Usb usb1;Usb usb2;Usb usb3;public void run(){System.out.println("电脑启动");if (usb1!=null){usb1.service();}if (usb2!=null){usb2.service();}if (usb3!=null){usb3.service();}}
}

Mouse实现类

public class Mouse implements Usb{@Overridepublic void service() {System.out.println("鼠标插上去了,正常启动了");}
}

Keyboard实现类

public class Keyboard implements Usb{@Overridepublic void service() {System.out.println("键盘插上去了,正常启动了");}
}

Upan实现类

public class Upan implements Usb{@Overridepublic void service() {System.out.println("U盘插上去了,正常启动了");}
}

TestComputer测试类

public class TestComputer {public static void main(String[] args) {Computer computer =new Computer();computer.usb1 = new Mouse();//多态,usb1是接口(也是computer的成员变量),Mouse是实Usb的实现类computer.usb2 = new Upan();computer.usb3 = new Keyboard();computer.run();}
}

在这里插入图片描述

接口的好处

接口就是一套规则,如同jdbc是java的一个重要接口,里面定义一些方法,java不负责书写里面的内容,具体的内容由各大厂商完成,比如使用Mysql,就导入mysql的jar包,包内含有实现java接口的实现类,使用Orcal同理。提高了代码的灵活性

接口与抽象类

接口的方法默认都是public的,是抽象的,接口中不能有实现(java 8之后,接口方法可以实现,使用default);抽象类中可以有非抽象方法

接口中的实例变量默认是final类型的,而抽象类中则不一定

一个类可以实现多个接口,但是最多只能继承一个抽象类

接口和抽象类都不能使用new来实例化,但是抽象类有构造方法,接口没有

从设计层面来说,抽象类是对事物的抽象,是一种模板设计,而接口是对行为的抽象,是一种行为规范

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

22-09-02 西安 JVM 类加载器、栈、堆体系、堆参数调优、GC垃圾判定、垃圾回收算法、对象的finalize机制

JVM入门 1、JVM结构图 JVM是运行在操作系统之上的,它与硬件没有直接的交互 方法区:存储已被虚拟机加载的类元数据信息(元空间) 堆:存放对象实例,几乎所有的对象实例都在这里分配内存 虚拟机栈(java栈):虚拟机栈描述…

springboot简单使用(4)

1.9 第九章 Thymeleaf 模版 1.9.1 认识 Thymeleaf Thymeleaf 是一个流行的模板引擎,该模板引擎采用 Java 语言开发 模板引擎是一个技术名词,是跨领域跨平台的概念,在 Java 语言体系下有模板引擎,在 C#、PHP 语言体系下也有模板引擎,甚至在 JavaScript 中也会用到模板引擎技…

每个架构师都值得拥有的一份Netty开发实战(附带面试专题)

前言 本书循序渐进的地介绍了 Netty各个方面的内容。 本书共分为 4 个部分(共15章): 第一部分详细地介绍 Netty 的相关概念以及核心组件;第二部分介绍自定义协议经常用到的编解码器;第三部分介绍 Netty 对于应用层高…

线程相关方法

1. wait,notify,notifyAll 1.1wait原理 1.2用法 阻塞阶段 让线程暂时休息,等到时机成熟再唤醒继续运行。 在对象执行wait方法的时候,线程必须拥有这个对象的monitor锁,然后释放锁,进入阻塞状态。 唤醒阶段…

如何让 ABAP 报表在后台作业的模式下运行

本教程迄今为止我们介绍的各种 ABAP 程序的编写,都是在事物码 SE38 或者 SE80 里完成之后,直接点击工具栏的执行按钮,或者使用 F8 快捷键来执行的: 以这种方式启动的 ABAP 程序,是以在线方式(online)运行的,有时也称 联机 模式。 也就是说,如果在执行 ABAP 程序的过程中…

利用 SSH 完成 Git 与 GitHub 的绑定

如上图所示,进入Settings页面后,再点击SSH and GPG Keys进入此子界面,然后点击New SSH key按钮:在「史上最简单的 GitHub 教程」中,我们已经对 GitHub 有了一定的了解,包括创建仓库、拉分支,或者通过Clone or download克隆或者下载代码;我们也下载并安装了 Git,也了解…

Java开发五年跳槽涨薪从12K到35K,靠“狂刷”九遍面试题

朋友做Java开发三年多的时间了,在老东家勤勤恳恳工作了三年多,工资也就是从刚开始的8K涨到了12K,天天给我吐槽他的工资低。2020年年初开始就一直在各种地方找资源,刷面试题,想要“骑驴找马”,恰恰又是在疫情…

jupyter 基本用法

前一段时间,同事帮我在超算服务器安装了一套 jupyter notebook 软件,甚是好用。但用了几天后,忽然就不能用了。今天研究了一下,发现是服务器程序关闭了,所以我在浏览器端的网页就打不开了。今天仔细研究了一下&#xf…

Unity入门01——unity界面基础

1.工程文件夹 1.Assets:工程资源文件夹((美术资源,脚本等等) 2.Library:库文件夹(Unity自动生成管理) 3.Logs:日志文件夹,记录特殊信息(Unity自动生成管理) 4.obj:编译产生中间文件(Unity自动生…

【05】Yarn

125_尚硅谷_Hadoop_Yarn_课程介绍 126_尚硅谷_Hadoop_Yarn_基础架构 整个集群资源的老大:ResourceManager 单个结点资源的老大:NodeManager 每一个作业任务的老大:ApplicationMaster 相应的容器(相当于一个小电脑)&…

DolphinScheduler实例表备份、清理

😋DolphinScheduler实例表备份、清理 👊一、前言 DolphinScheduler至今已经在项目中使用了将近一年,工作流实例和任务流实例都积累了百万级的数据量。在查看工作流实例和任务实例的时候,都要等待后台去查询数据库,感觉…

【电商项目实战】拦截器(详细篇)

🍁博客主页:👉不会压弯的小飞侠 ✨欢迎关注:👉点赞👍收藏⭐留言✒ ✨系列专栏:👉SpringBoot电商项目实战 ✨学习社区: 👉不会压弯的小飞侠 ✨知足上进&#x…

Python tkinter 制作一个经典的登录界面和点击事件

前言Tkinter(即 tk interface) 是 Python 标准 GUI 库,简称 “Tk”;从本质上来说,它是对 TCL/TK 工具包的一种 Python 接口封装。Tkinter 是 Python 自带的标准库,因此无须另行安装,它支持跨平台运行,不仅可以在 Windows 平台上运行,还支持在 Linux 和 Mac 平台上运行…

怎样在LaTeX中方便输入带圆圈的数字

这个也是这两天修改别人论文的时候得到的经验。正如这里所说:latex 如何添加圆圈数字?_Tsingke的博客-CSDN博客 如果使用\textcircled,数字编号大的时候,数字会跑到圆圈外面。但是上面这篇博客的解决方案太复杂了,就像…

电子数据取证-流程与技术

推荐公众号:安全猎人 专注于全栈攻防,学习笔记等; 原文url:https://mp.weixin.qq.com/s/hwpBcp-55ycXnSdObEffGg 电子数据取证流程与技术 根据某大佬经验,汇总出一系列取证流程、理论和模型; 在模型中&am…

pacman 升级软件包提示 “failed to commit transaction (invalid or corrupted package)“

很久没打开 WSL 2 里面的 Arch Linux, 想着更新一下软件包, 执行 pacman -Syu, 遇到 “signature is marginal trust” “failed to commit transaction (invalid or corrupted package)” 等错误. 观察输出的信息, 似乎提到了 “签名” “信任” 的问题 (signature … is marg…

快鲸智慧楼宇:助力商业地产快速实现数字化转型升级

作为国内领先的商业地产运营管理数字化服务商,快鲸搭建了集资产管理、合同管理、租客管理、财务管理、招商管理、物业管理等一套完整的 “商办招商营销管理空间资产运营管理租客运营服务体系”,致力于打造全场景商办地产标准化运营管理平台。 该平台具备…

C++之二叉树进阶|搜索树|key/value模型

🐧主页详情:Choice~的个人主页 📢作者简介:🏅物联网领域创作者🏅 and 🏅阿里专家博主🏅 and 🏅华为云享专家🏅 ✍️人生格言:最慢的步伐不是跬步&…

线程与进程的关联

上篇博客 我们说了进程 下面我来用一个我们回忆一下 其实啊 进程在频繁的创建 / 销毁的时候 是非常低效的 -因为创建的时候 要给进程分配资源(内存/文件) 赋值到CPU上 是一个大活 所以 有了线程 那咱们已经很了解进程了 直接说 线程 与 进程 的区别: 对比进程线程1包含线程2…

微服务项目:尚融宝(14)(前端平台:尚融宝管理系统路由配置)

认清现实&#xff0c;放弃幻想&#xff0c;准备斗争 一、组件定义 1、创建vue组件 在src/views文件夹下创建以下文件夹和文件 2、core/integral-grade/list.vue <template><div class"app-container">积分等级列表</div> </template> 3、…