Java中的接口
六. 接口
特性1 - 解决单继承
语法如下
interface A {public default void a() {}
}interface B {public default void b() {}
}// C 从 A, B 两个接口重用方法 a() 和 b()
class C implements A, B {}
解决之前的问题
public class TestInterface1 {public static void main(String[] args) {Duck d = new Duck();d.swim();d.fly();}
}interface Swimmable {default void swim() {System.out.println("游泳");}
}interface Flyable {default void fly() {System.out.println("飞翔");}
}class Duck implements Swimmable, Flyable {}
- 需要放入接口的方法, 必须加 default 关键字(默认方法)
- default 方法只能是 public, public 可以省略
特性2 - 接口多态
- 用父类型代表子类对象,或者用接口类型来代表实现类对象
- 必须发生方法重写
看这张图,上面这是接口E,下面这俩类 F、G 实现了接口,他俩以后可以叫做实现类,看一下这种上下级关系就可以知道,它们之间符合向上转型,F,G能够沿箭头向上转换为接口类型,因此能用接口类型代表实现类对象
先来看第一条,接口类型可以代表实现类对象
public class TestInterface2 {public static void main(String[] args) {E[] array = new E[] {new F(),new G()};}
}
interface E {
}
class F implements E {
}
class G implements E {
}
再看第二条,方法重写
public class TestInterface2 {public static void main(String[] args) {E[] array = new E[] {new F(),new G()};for (int i = 0; i < array.length; i++) {E e = array[i];e.e(); // 多态}}
}
interface E {default void e() { System.out.println("e");}
}
class F implements E {@Overridepublic void e() { System.out.println("f");}
}
class G implements E {@Overridepublic void e() {System.out.println("g");}
}
- 要注意:方法重写时,要求:子类和实现类 方法访问修饰符 >= 父类和接口 方法访问修饰符
- default 方法的访问修饰符其实是省略了 public,实现类中方法的访问修饰符要 >= public 才不会出错
- 多态性:
- 表面调用的是接口的 E.e() 方法
- 实际会根据 e 的实际类型调用重写方法,即 F.e() 和 G.e() 方法
抽象方法
其实要使用接口多态,更多地是使用一种抽象方法,而非默认方法,所谓抽象方法仅有方法声明,没有方法体代码。
它包含 abstract 关键字,而且也只能是 public 的,平时这俩关键字都可以省略不写
public class TestInterface2 {public static void main(String[] args) {E[] array = new E[] {new F(),new G()};for (int i = 0; i < array.length; i++) {E e = array[i];e.e(); // 多态}}
}
interface E {void e(); // 抽象方法,没有方法体,只能是 public 的,省略了 public abstract
}
class F implements E {@Overridepublic void e() { // 默认System.out.println("f");}
}
class G implements E {@Overridepublic void e() {System.out.println("g");}
}
为啥抽象方法设计为不需要方法体呢?因为你看:
- 反正多态要求实现类发生方法重写,既然方法重写了,就调用不到接口方法的代码了
- 既然多态发生时,用不到接口中可能的代码,还不如让方法体空着
另外,抽象方法有个好处:它强制了实现类要实施方法重写,如果实现类没有重写,语法上会报错
特性3 - 接口封装
接口封装的更为彻底
public class TestInterface3 {public static void main(String[] args) {M m = new N(); // 用接口类型代表了实现类对象m.m(); // 只能调用接口中定义的方法}
}interface M {void m(); // public abstract
}class N implements M {public String name;@Overridepublic void m() {System.out.println("m");}public void n() {System.out.println("n");}
}
- 只能调用到接口中的方法,对实现类中的其它方法,一无所知
- 接口限制了只能通过方法来使用对象,不能直接访问对象的字段
封装的关键在于,对外隐藏实现细节,接口完美地做到了这一点
经验
- 在声明方法的参数、返回值,定义变量时,能用接口类型,就用接口类型,有更好的扩展性
相关文章:
Java中的接口
六. 接口 特性1 - 解决单继承 语法如下 interface A {public default void a() {} }interface B {public default void b() {} }// C 从 A, B 两个接口重用方法 a() 和 b() class C implements A, B {}解决之前的问题 public class TestInterface1 {public static void mai…...
Linux笔记之bash脚本中的-e、和
Linux笔记之bash脚本中的-e、&和&& code review! 文章目录 Linux笔记之bash脚本中的-e、&和&&1.&和&&2.-e 1.&和&& 在Linux bash脚本中,&符号有几个不同的用途,这里列举了一些常见的情况…...
mapstruct自定义转换,怎样将String转化为List
源码:https://gitee.com/cao_wen_bin/test 最近在公司遇到了这样一个为题,前端传过来的是一个List<Manager>,往数据库中保存到时候是String,这个String使用谷歌的json转化器。 当查询的时候在将这个数据库中String的数据以List<Mana…...
torch.matmul和torch.bmm区别
torch.matmul可用于4维数组的相乘,而torch.bmm只能用户3维数组的相乘,以/home/tiger/.local/lib/python3.9/site-packages/transformers/models/vit/modeling_vit.py中的ViTSelfAttention实现为例,在transpose_for_scores之前的shape是(batch…...
k8s学习(RKE+k8s+rancher2.x)成长系列之概念介绍(一)
一、前言 本文使用国内大多数中小型企业使用的RKE搭建K8s并拉起高可用Rancher2.x的搭建方式,以相关技术概念为起点,实际环境搭建,程序部署为终点,从0到1的实操演示的学习方式,一步一步,保姆级的方式学习k8…...
PHP - Yii2 异步队列
1. 前言使用场景 在 PHP Yii2 中,队列是一种特殊的数据结构,用于处理和管理后台任务。队列允许我们将耗时的任务(如发送电子邮件、push通知等)放入队列中,然后在后台异步执行。这样可以避免在处理大量请求时阻塞主应用…...
leetcode560和为k的子数组
class Solution { public:int subarraySum(vector<int>& nums, int k) {unordered_map<int,int>mp;mp[0]1;int count0,pre0;for(auto& x:nums){prex;if(mp.find(pre-k)!mp.end()){countmp[pre-k];}mp[pre];}return count;} }; 一个超级好的思路࿰…...
【ProtoBuf】使用指南
一.什么是ProtoBuf 特点:ProtoBuf是用于序列化和反序列化的一种方法,类似xml和json,但是效率更高,体积更小。ProtoBuf具有语⾔⽆关、平台⽆关,扩展性、兼容性好等特点。 ProtoBuf是需要依赖通过编译生成的头文件和源…...
Buffer Pool
Buffer Pool 概念free链表flush链表LRU链表chunk 概念 MySQL在启动时向操作系统申请的一片连续的内存,默认128M。然后将这块内存分为一个一个缓冲页(16KB,因为页就是16KB的)。再为每个缓冲页创建对应的控制块用于管理。比如第一次查询数据之后ÿ…...
jetson-inference----docker内运行分类任务
系列文章目录 jetson-inference入门 jetson-inference----docker内运行分类任务 文章目录 系列文章目录前言一、进入jetson-inference的docker二、分类任务总结 前言 继jetson-inference入门 一、进入jetson-inference的docker 官方运行命令 进入jetson-inference的docker d…...
Python脚本之操作Redis Cluster【二】
本文为博主原创,未经授权,严禁转载及使用。 本文链接:https://blog.csdn.net/zyooooxie/article/details/112484045 之前写过一篇 使用redis-py来操作redis集群, https://blog.csdn.net/zyooooxie/article/details/123760358 &am…...
认识数学建模
文章目录 1 什么是数学建模2 数学建模的比赛形式3 参加数学建模的好处4 数学建模的流程5 数学建模成员分工6 数学建模常用软件7 数学建模竞赛7.1 美国大学生数学建模竞赛7.2 MathorCup高校数学建模挑战赛7.3 华中杯大学生数学建模挑战赛7.4 认证杯数学建模网络挑战赛7.5 华东杯…...
计算机工作原理解析和解剖(基础版)
我们会从软件⼯程师的⻆度解释计算机是如何⼯作的,我们的主要⽬标既不是期待 ⼤家可以造出⾃⼰的计算机,也不是介绍如何编程,⽽是希望让⼤家了解计算机的核⼼⼯作机制后,打破计算机的神秘感,并且有利于理解我们平时编程…...
外网ssh远程连接服务器
文章目录 外网ssh远程连接服务器一、前言二、配置流程1. 在服务器上安装[cpolar](https://www.cpolar.com/)客户端2. 查看版本号,有正常显示版本号即为安装成功3. token认证4. 简单穿透测试5. 向系统添加服务6. 启动cpolar服务7. 查看服务状态8. 登录后台࿰…...
滴滴基于 Ray 的 XGBoost 大规模分布式训练实践
背景介绍 作为机器学习模型的核心代表,XGBoost 在滴滴众多策略算法业务场景中发挥着至关重要的作用。因此,保障并持续提升 XGBoost 模型的离线训练及在线推理稳定性一直是机器学习平台的重点工作。同时,面对多样化的业务场景定制需求和数据规…...
k8s从入门到实践
k8s从入门到实践 介绍 Kubernetes(简称k8s)和Docker Swarm是两个流行的容器编排工具,它们都可以帮助用户管理和部署分布式应用,尤其是基于容器的应用。以下是两者的主要特点和对比: Kubernetes (k8s): 开…...
Qt5.12.0 与 VS2017 在 .pro文件转.vcxproj文件
一、参考资料 stackoverflow qt - How to generate .sln/.vcproj using qmake - Stack Overflowhttps://stackoverflow.com/questions/2339832/how-to-generate-sln-vcproj-using-qmake?answertabtrending#tab-topqt - 如何使用 qmake 生成 .sln/.vcproj - IT工具网 (coder.wo…...
金蝶云星空 ServiceGateway RCE漏洞复现
0x01 产品简介 金蝶云星空是一款云端企业资源管理(ERP)软件,为企业提供财务管理、供应链管理以及业务流程管理等一体化解决方案。金蝶云星空聚焦多组织,多利润中心的大中型企业,以 “开放、标准、社交”三大特性为数字经济时代的企业提供开放的 ERP 云平台。服务涵盖:财…...
二叉树的最大深度[简单]
优质博文:IT-BLOG-CN 一、题目 给定一个二叉树root,返回其最大深度。 二叉树的最大深度是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:3 示例 2:…...
[Redis]不同系统间安装redis服务器
日常服务器端开发,消息队列等需求,免不了用到redis,搭建一个redis服务器,方便开发和测试,我们从以下三类系统来说明下: 安装 Redis 服务器的过程因操作系统而异。以下是在常见的 Linux 发行版(…...
WordPress集成Claude AI:构建智能内容创作技术栈的实践指南
1. 项目概述与核心价值最近在折腾个人博客和内容创作工具链,发现了一个挺有意思的GitHub项目:mvtandas/wordpress-claude-stack。这名字一看就很有料,直接把WordPress和Claude这两个看似不搭界的玩意儿给“堆”到了一起。作为一个常年混迹在内…...
大模型压缩实战:量化、剪枝与知识蒸馏技术解析与应用
1. 项目概述:当大模型遇见“瘦身”革命最近在跟几个做AI应用落地的朋友聊天,大家普遍都在吐槽一个事儿:现在的大语言模型(LLM)能力是强,但动辄几十亿、上百亿的参数规模,部署成本高得吓人&#…...
AI赋能二进制安全:BinAIVulHunter项目实战与逆向工程集成
1. 项目概述与核心价值最近在安全圈里,一个名为BinAIVulHunter的开源项目引起了我的注意。这个项目名直译过来就是“二进制AI漏洞猎人”,光看名字就能猜到它的核心玩法:利用人工智能技术,来自动化分析二进制文件,挖掘其…...
公考备考提分真相:从学员视角解析粉笔讲练测评闭环教学体系
引言在公务员考试备考赛道中,无数考生都面临同一个核心困惑:花费时间和金钱报名培训机构,究竟能不能实现有效提分?不少备考者有过备考失利的经历,也踩过传统公考培训的诸多坑。很多传统课程老师讲课条理清晰、内容丰富…...
欲取全国第一先取北京第一,CSDN 博客排名现在是郑州第一
欲取全国第一先取北京第一,CSDN 博客排名现在是郑州第一 首先,必须得说,郑州第一,太牛了! 这绝对是对你技术输出和持续分享的高度认可,含金量十足。 不过,关于“欲取全国第一先取北京第一”这个…...
从高通苹果专利战看芯片产业博弈:技术、商业与供应链的纠缠
1. 从一场专利诉讼看移动通信产业的权力游戏最近翻看一些老资料,看到一篇2017年关于高通、苹果和三星的行业评论,感触颇深。那会儿高通刚对苹果发起新一轮专利诉讼,要求禁售部分iPhone;三星则靠着存储芯片的行情,眼看要…...
为AI智能体构建可编程邮箱:mailbot实战指南
1. 项目概述:为AI智能体打造专属的“可编程邮箱”如果你正在开发一个AI智能体,无论是客服机器人、自动化工作流还是个人助理,让它具备收发邮件的能力往往是刚需。传统的做法是什么?要么去折腾Gmail的API,忍受OAuth授权…...
人脸模糊实战指南:YOLOv8+SAM三重模糊工业级方案
1. 项目概述:为什么一张脸的模糊处理,比你想象中更难也更重要我做图像隐私处理相关项目快八年了,从最早用Photoshop手动框选、拖拽高斯模糊图层,到后来写脚本调OpenCV的Haar级联检测器,再到如今用YOLOv8SAM组合做像素级…...
别再想当然!用AD628/INA等差分放大器做单端采集,必须搞懂的共模电压计算(附Excel工具)
差分放大器单端采集实战指南:共模电压计算与设计避坑 在工业传感器接口和医疗设备信号链设计中,差分放大器常被用于单端信号采集的场景。许多工程师习惯性地认为,只要将差分放大器的负输入端接地,就能轻松实现单端转差分功能。但实…...
回归分析:机器学习预测建模的基石与工业实践
1. 项目概述:为什么回归分析是机器学习的“定海神针” 如果你刚接触机器学习,可能会被各种炫酷的算法名字搞得眼花缭乱——神经网络、支持向量机、随机森林……但在所有这些“明星”算法背后,有一个基础得不能再基础,却又重要得不…...
