从零学Java - 接口
Java 接口
文章目录
- Java 接口
- 1.接口的语法
- 1.1 与抽象类的区别
- 2.如何使用接口?
- 2.1 接口的使用规范
- 3.什么是接口?
- 3.1 常见关系
- 4.接口的多态性
- 5.面向接口编程
- 5.1 接口回调
- 6.特殊接口
- 6.1 常量接口
- 6.2 标记接口
- 7.接口的好处
- 补充
- 面向对象 七大设计原则
1.接口的语法
接口:相当于特殊的抽象类,定义方式、组成部分与抽象类类似。
eg:
特点:
使用interface关键字定义接口
没有构造方法,不能创建对象
只能定义:公开静态常量、公开抽象方法
// JDK 1.8 之前
public interface Myinterface {public static final int COUNt = 100;public abstract void method();
}
/* 可以省略 'public', 'static', 'final', 'abstract' 关键字Modifier 'public' is redundant for interface membersModifier 'static' is redundant for interface fieldsModifier 'final' is redundant for interface fieldsModifier 'abstract' is redundant for interface methods
*///JDK 1.8 之后
JDK 1.8 版本接口中可以包含公开静态方法和公开默认方法- 公开静态方法:不能被继承,通过接口名.方法名调用static void method() {...}- 公开默认方法:可以被继承,也可以被重写,通过实现类调用default void method() {...} //default 不是访问权限修饰符, 仅表示 "默认"
1.1 与抽象类的区别
相同:
- 可编译成字节码文件。
- 不能创建对象。
- 都可以声明变量(引用)。
- 隐式具备Object类中所定义的方法。
不同:
- 接口所有属性都是公开静态常量,隐式使用public static final修饰。
- 接口所有方法都是公开抽象方法,隐式使用public abstract修饰。
- 接口没有构造方法、动态代码块、静态代码块。
- 抽象类没有限制。
2.如何使用接口?
同抽象类相似, 都需要一个类去实现它; 使用 implement 关键字实现;
eg:
如何使用接口
接口:
public interface MyInterface {int COUNt = 100;void method();
}
实现类:
public class Student implements MyInterface{@Overridepublic void method() {System.out.println("实现接口中的方法");}
}
测试类:
public class Test {public static void main(String[] args) {//使用声明引用Student student = new Student();//调用方法student.method();//调用常量System.out.println(Student.COUNt);}
}
2.1 接口的使用规范
-
任何类在实现接口时,必须实现接口中所有的抽象方法,否则此类为抽象类。
-
实现接口中的抽象方法时,访问修饰符必须是public。
-
同父类一样,接口可声明为引用,并指向实现类对象。
-
仅可调用接口中所声明的方法,不可调用实现类中独有的方法。
-
可强转回实现类本身类型,进行独有方法调用。
-
3.什么是接口?
宏观概念:接口是一种标准。

微观概念:接口是一种能力和约定。
- 接口的定义:代表了某种能力。
- 方法的定义:能力的具体要求。
经验:Java为单继承,当父类的方法种类无法满足子类需求时,可实现接口扩充子类能力。
接口支持多实现,可为类扩充多种能力。
3.1 常见关系
- 类与类: extends
- 单继承
- extends 父类名称
- 类与接口: implement
- 多实现
- implements 接口名称1 , 接口名称2 , 接口名称n
- 继承和实现同时存在时,继承在前,实现在后
- 接口与接口:
- 多继承
- extends 父接口1 , 父接口2 , 父接口n
4.接口的多态性
内存图:
特点:(微观概念) 接口是一种能力和约定。
不同引用类型,仅可调用自身类型中所声明的方法。
eg:
编写代码, 体现接口是一种能力和约定,以及接口的多态性
Animal:
public abstract class Animal {String breed;int age;String gender;public abstract void eat();public abstract void sleep();public abstract void show();
}
Runnable:
public interface Runnable {void run();
}
Swimmable:
public interface Swimmable {void swim();
}
Dog:
public class Dog extends Animal implements Runnable, Swimmable{String color;@Overridepublic void eat() {System.out.println("狗狗啃骨头...");}@Overridepublic void sleep() {System.out.println("狗狗睡觉...");}@Overridepublic void show() {System.out.println("狗狗信息...");}@Overridepublic void run() {System.out.println("狗狗奔跑...");}@Overridepublic void swim() {System.out.println("狗狗游泳...");}public void shout() {System.out.println("狗狗开始狗叫...");}
}
Test:
public class Test {public static void main(String[] args) {//创建狗狗对象//把狗狗当作狗看Dog dog = new Dog();dog.eat();dog.sleep();dog.show();dog.run();dog.swim();dog.shout();//多态: 把狗狗当作Animal看Animal animal = dog;animal.eat();animal.sleep();animal.show();//多态: 把狗狗当作能跑的对象看Runnable runnable = dog;runnable.run();//多态: 把狗狗当作能游泳的对象看Swimmable swimmable = dog;swimmable.swim();}
}
5.面向接口编程
特点:(宏观概念) 接口是一种标准。
面向接口编程,而非面向实现类 (依赖倒置原则)
eg:
用代码实现: 电脑具有USB接口, 连接带USB接口的设备
Usb:
public interface Usb {void service();
}
Fan:
public class Fan implements Usb{@Overridepublic void service() {System.out.println("风扇开始工作, 降温....");}
}
Mouse:
public class Mouse implements Usb{@Overridepublic void service() {System.out.println("鼠标开始工作, 移动...");}
}
Computer:
public class Computer {public Usb usb1, usb2;public void work() {System.out.println("电脑开始工作...");if (usb1 != null) {//实现者 交给 接口的使用者 调用usb1.service();}if (usb2 != null) {usb2.service();}}
}
Test:
public class Test {public static void main(String[] args) {Computer Leven = new Computer();Mouse mouse = new Mouse();Fan fan = new Fan();//连接电脑Leven.usb1 = mouse;Leven.usb2 = fan;Leven.work();}
}
5.1 接口回调
使编程符合现实逻辑
接口回调:先有接口的使用者,后有接口的实现者; 实现者交给接口的使用者调用
先有电脑, 再有鼠标, 鼠标需要交给电脑来使用
没有电脑, 光有鼠标, 逻辑上没法使用鼠标的功能
6.特殊接口
6.1 常量接口
常量接口: 将多个常用于表示状态或固定值的变量,以静态常量的形式定义在接口中统一管理,提高代码可读性。
eg:
public interface Week {//静态常量String MONDAY = "星期一";String TUESDAY = "星期二";String WEDNESDAY = "星期三";String THURSDAY = "星期四";String FRIDAY = "星期五";String SATURDAY = "星期六";String SUNDAY = "星期日";
}
6.2 标记接口
标记接口: 接口没有任何成员,仅仅是一个标记。Serializable、Cloneable
7.接口的好处
- 降低程序的耦合性,更自然的使用多态。
- 设计与实现完全分离,更容易搭建程序框架,更换具体实现。
补充
面向对象 七大设计原则
总则:开闭原则(Open Close Principle,OCP)
- 开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,而是要扩展原有代码,实现一个热插拔的效果。
单一职责原则(Single Responsibility Principle,SRP)
- 不要存在多于一个导致类变更的原因,也就是说每个类应该实现单一的职责,如若不然,就应该把类拆分。
里氏替换原则(Liskov Substitution Principle,LSP)
- 里氏替换原则中说,任何基类可以出现的地方,子类一定可以出现。
- 里氏替换原则中,子类对父类的方法尽量不要重写和重载。因为父类代表了定义好的结构,通过这个规范的接口与外界交互,子类不应该随便破坏它。
依赖倒置原则(Dependence Inversion Principle,DIP)
- 面向接口编程,依赖于抽象而不依赖于具体。写代码时用到具体类时,不与具体类交互,而与具体类的上层接口交互。
接口隔离原则(Interface Segregation Principle,ISP)
- 每个接口中不存在子类用不到却必须实现的方法,如果不然,就要将接口拆分。使用多个隔离的接口,比使用单个接口(多个接口方法集合到一个的接口)要好。
迪米特法则(最少知道原则)(Demeter Principle,DP)
- 一个类对自己依赖的类知道的越少越好。也就是说无论被依赖的类多么复杂,都应该将逻辑封装在方法的内部,通过public方法提供给外部。这样当被依赖的类变化时,才能最小的影响该类。
- 只和朋友通信,不和陌生人说话。
合成/聚合复用原则(Composite Reuse Principle,CRP)
- 原则是尽量首先使用合成/聚合的方式,而不是使用继承。
相关文章:
从零学Java - 接口
Java 接口 文章目录 Java 接口1.接口的语法1.1 与抽象类的区别 2.如何使用接口?2.1 接口的使用规范 3.什么是接口?3.1 常见关系 4.接口的多态性5.面向接口编程5.1 接口回调 6.特殊接口6.1 常量接口6.2 标记接口 7.接口的好处 补充面向对象 七大设计原则 1.接口的语法 接口&a…...
安全防御之身份鉴别技术
身份认证技术用于在计算机网络中确认操作者的身份。在计算机网络世界中,用户的身份信息是用一组特定的数据来表示的,计算机也只能识别用户的数字身份。身份认证技术能够作为系统安全的第一道防线,主要用于确认网络用户的身份,防止…...
axios post YII2无法接收post参数问题解决
axios post YII2无法接收post参数问题解决 在yii 配置文件中增加 ‘parsers’ > [“application/json” > “yii\web\JsonParser”] 如下所示: $config [id > basic,language > zh-CN,timeZone > env(TIME_ZONE, PRC),basePath > $basePath,bo…...
性能优化-OpenMP基础教程(三)
本文主要介绍OpenMP并行编程的环境变量和实战、主要对比理解嵌套并行的效果。 🎬个人简介:一个全栈工程师的升级之路! 📋个人专栏:高性能(HPC)开发基础教程 🎀CSDN主页 发狂的小花 &…...
[足式机器人]Part2 Dr. CAN学习笔记-动态系统建模与分析 Ch02-1+2课程介绍+电路系统建模、基尔霍夫定律
本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记-动态系统建模与分析 Ch02-12课程介绍电路系统建模、基尔霍夫定律 1. 课程介绍2. 电路系统建模、基尔霍夫定律 1. 课程介绍 2. 电路系统建模、基尔霍夫定律 基本元件: 电量 库伦&…...
VSCode配置C/C++环境
文章目录 1. 安装配置 C 编译器1.1 下载 MinGW1.2 Mingw添加到系统变量1.3 验证 2. 安装和配置VSCode2.1 安装VSCode2.2 VSCode配置C环境2.3. 优化 3.参考文章 本文主要记录在VSCode中配置C环境,非常感谢参考文章中的博主。 1. 安装配置 C 编译器 首先需要安装 C 编…...
ChatGPT绘制全球植被类型分布图、生物量图、土壤概念图、处理遥感数据并绘图、病毒、植物、动物细胞结构图
以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮,可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…...
vmware workstation的三种网络模式通俗理解
一、前言 workstations想必很多童鞋都在用,经常会用来在本机创建不同的虚拟机来做各种测试,那么对于它支持的网络模式,在不同的测试场景下应该用哪种网络模式,你需要做下了解,以便可以愉快的继续测(搬&…...
C++程序设计兼谈对象模型(侯捷)笔记
C程序设计兼谈对象模型(侯捷) 这是C面向对象程序设计的续集笔记,仅供个人学习使用。如有侵权,请联系删除。 主要内容:涉及到模板中的类模板、函数模板、成员模板以及模板模板参数,后面包含对象模型中虚函数调用&…...
selenium实现UI自动化
1.selenium简介 selenium是支持web浏览器自动化的一系列工具和库的综合项目。具有支持linux、windows等多个平台,支持Firefox、chrome等多种主流浏览器;支持Java、Python等多种语言。 主要包括的三大工具有: WebDriver(rc 1.0)、…...
【DevOps-03】Build阶段-Maven安装配置
一、简要说明 下载安装JDK8下载安装Maven二、复制准备一台虚拟机 1、VM虚拟复制克隆一台机器 2、启动刚克隆的虚拟机,修改IP地址 刚刚克隆的虚拟机 ,IP地址和原虚拟的IP地址是一样的,需要修改克隆后的虚拟机IP地址,以免IP地址冲突。 # 编辑修改IP地址 $ vi /etc/sysconfig…...
已解决java.lang.ArrayIndexOutOfBoundsException异常的正确解决方法,亲测有效!!!
已解决java.lang.ArrayIndexOutOfBoundsException异常的正确解决方法,亲测有效!!! 目录 报错问题 解决思路 解决方法 总结 Q1 - 报错问题 java.long.ArrayIndexOutOfBoundsException 是Java中的一个运行时异常,…...
Pycharm打包程序为exe文件
Pycharm打包程序为exe文件 【一】导入模块pyinstaller 【1】图片说明 【2】文字说明 根据图片顺序执行 首先点击file进入settings界面,在setting界面找到Project下面的Python Interpretor,点击号进行模块的添加在搜索框中输入pyinstaller,…...
地理空间分析3——数据可视化与地理空间
写在开头 数据可视化是将数据以图形形式呈现,使其更易于理解和分析的过程。在地理空间分析中,数据可视化不仅能够展示地理位置信息,还能够有效地传达地理空间数据的模式、趋势和关联。本文将探讨数据可视化在地理空间分析中的作用,介绍Python中常用的数据可视化工具,并深…...
python开发案例教程-清华大学出版社(张基温)答案(4.3)
练习 4.1 1. 判断题 判断下列描述的对错。 (1)子类是父类的子集。 ( ✖ ) (2)父类中非私密的方法能够被子类覆盖。 ( ✔ ) (3)子类…...
Qt 5.9.4 转 Qt 6.6.1 遇到的问题总结(一)
最近公司对大家的开发的硬件环境进行了升级,电脑主机的配置、显示器(两台大屏显示器)变得的逼格高多了。既然电脑上的开发环境都需要重装,就打算把开发环境也升级到最新版本,要用就用最新版本。下面对升级后的开发环境…...
探索生成式AI:自动化、问题解决与创新力
目录 自动化和效率:生成式AI的颠覆力量 解谜大师生成式AI:如何理解和解决问题 创新与创造力的启迪:生成式AI的无限潜能 自动化和效率:生成式AI的颠覆力量 1. 神奇的代码生成器:生成式AI可以帮助开发人员像魔术一样快…...
UI5与后端的文件交互(一)
文章目录 前言一、RAP的开发1. 创建表格2. 创建CDS Entity3. 创建BDEF4. 创建implementation class5. 创建Service Definition和Binding6. 测试API 二、创建UI5 Project1. 使用Basic模板创建2. 创建View3. 测试页面及绑定的oData数据是否正确4. 创建Controller5. 导入外部包&am…...
[HCTF 2018]Warmup
[HCTF 2018]Warmup wp 进入页面: 查看源码: 发现提示:source.php ,直接访问,得到源代码: <?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){$whitelist [&qu…...
编译原理笔记(三)
一、词法分析程序的设计 1、词法分析程序的输出 在识别出下一个单词同时验证其词法正确性之后,词法分析程序将结果以单词符号的形式发送至语法分析程序以回应其请求。 单词符号一般分下列5类: 关键字:如:begin、end、if、whil…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
