【JavaSE】接口 详解(上)
前言
本篇会讲到Java中接口内容,概念和注意点可能比较多,需要耐心多看几遍,我尽可能的使用经典的例子帮助大家理解~
欢迎关注个人主页:逸狼
创造不易,可以点点赞吗~
如有错误,欢迎指出~
目录
前言
接口
语法
注意
代码理解
接口运用举例
IUSB接口
KeyBoard类
Mouse类
Computer类
多个接口
代码理解(语法层面)
接口解决多继承问题 代码示例
Animal类
IFly、IRunning、ISwimming接口
Fish类
Duck类
再加上一个测试
接口间的继承
代码理解
接口
接口是公共的行为规范标准,在Java中,接口是多个类的公共规范,是一种引用数据类型。
语法
- 定义格式与类基本相同,将class关键字换成interface关键字
- 接口中的成员变量(习惯上是大写)默认为public static final 修饰的(写的时候可省略public static final),必须被初始化
- 接口中的方法默认只能是public abstract 修饰的(也可省略不写,不写默认也是抽象方法(不能有具体的实现,否则会报错),用其他修饰符会报错)
- 接口中使用default修饰的方法和static修饰的方法是可以有具体的实现的
- 接口中不能有静态代码块、示例代码块和构造方法。
- 接口虽然不是类,但编译完成后也是字节码文件(后缀名是.class)。
注意
- 创建接口时, 接口的命名一般以大写字母 I 开头
- 接口的命名一般使用 "形容词" 词性的单词.
- 阿里编码规范中约定, 接口中的方法和属性不要加任何修饰符号, 保持代码的简洁性.
代码理解
package demo2inter;public interface ITestInterFace {public static final int a=100;int AGE=10;abstract public void fun1();void fun2();default void func(){System.out.println("default!");}public static void staticFunc(){System.out.println("staticFunc!");}
}
接口的简单使用
- 接口不能被实例化
- 接口需要被类实现,需要使用关键字implements来实现
- 当一个类实现类这个接口,那么这个类要重写这个方法
- 接口也可以发生向上转型、动态绑定和多态。
public interface ITestInterFace {void draw();}
class Rect implements ITestInterFace{@Overridepublic void draw() {System.out.println("画一个矩形!");}
}
class Triangle implements ITestInterFace{@Overridepublic void draw() {System.out.println("画一个三角形!");}
}
class Test{public static void drawMap(ITestInterFace iTestInterFace){iTestInterFace.draw();}public static void main(String[] args) {drawMap(new Rect());//发生了向上转型和动态绑定drawMap(new Triangle());}
}
接口运用举例
请实现笔记本电脑使用USB鼠标、USB键盘的例子
- USB接口:包含打开设备、关闭设备功能
- 笔记本类:包含开机功能、关机功能、使用USB设备功能
- 鼠标类:实现USB接口,并具备点击功能
- 键盘类:实现USB接口,并具备输入功能
在包demo3中,创建3个类,一个接口
IUSB接口
package demo3;public interface IUSB {// USB接口void openDevice();//打开服务void closeDevice();//关闭服务}
KeyBoard类
package demo3;public class KeyBoard implements IUSB {@Overridepublic void openDevice() {System.out.println("打开键盘!");}@Overridepublic void closeDevice() {System.out.println("关闭键盘!");}public void input(){System.out.println("键盘输入!");}
}
Mouse类
package demo3;public class Mouse implements IUSB{@Overridepublic void openDevice() {System.out.println("打开鼠标!");}@Overridepublic void closeDevice() {System.out.println("关闭鼠标!");}public void click(){System.out.println("点击鼠标!");}
}
Computer类
package demo3;import demo2inter.ITestInterFace;public class Computer {public void powerOff (){System.out.println("关闭电脑!");}public void powerOn(){System.out.println("打开电脑!");}public void useDevice(IUSB usb){usb.openDevice();//这里要区分 USB引用了哪个对象if(usb instanceof Mouse){Mouse mouse =(Mouse) usb;//向下转型mouse.click();}//调用键盘if(usb instanceof KeyBoard){KeyBoard keyBoard=(KeyBoard) usb;keyBoard.input();}usb.closeDevice();}public static void main(String[] args) {Computer computer=new Computer();computer.powerOn();computer.useDevice(new KeyBoard());//向上转型computer.useDevice(new Mouse());computer.powerOff();}
}
多个接口
Java中不支持多继承,但是一个类可以实现多个接 口。接口表达含义是 具有**特性,可以帮助程序员忘掉类型,只关注特性。
代码理解(语法层面)
类TestDemo4实现了IA和IB接口
package demo4;//多个接口
interface IA{void testA();
}
interface IB{void testB();
}
class TestDemo4 implements IA,IB{@Overridepublic void testA() {System.out.println("testA()");}@Overridepublic void testB() {System.out.println("testB()");}
}
public class Test4 {public static void main(String[] args) {TestDemo4 testDemo4=new TestDemo4();testDemo4.testA();testDemo4.testB();}}
接口解决多继承问题 代码示例
在demomoreinher包中有Animal抽象类,Duck,Fish类 以及IFly、IRunning、ISwimming接口
Animal类
IFly、IRunning、ISwimming等动物特性应该采用接口方式
package demomoreinher;public abstract class Animal {protected String name;protected int age;public Animal(String name, int age) {this.name = name;this.age = age;}public abstract void eat();//像跑 游泳 飞等动作不能写在这里,因为不是所有动物都会这些技能 应该写在接口中
}
IFly、IRunning、ISwimming接口
//注意:这里的代码是在不同IFly、IRunning、ISwimming接口文件中的
public interface IFly {void fly();
}public interface IRunning {void run();
}public interface ISwimming {void swim();
}
Fish类
鱼只会游泳这项特性,所以接口ISwimming
package demomoreinher;public class Fish extends Animal implements ISwimming{//如果这里游泳写出类,java是不支持多继承的,所有说接口解决了多继承问题public Fish(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println(this.name+"吃鱼粮!");}@Overridepublic void swim() {System.out.println(this.name+"游泳~");}
}
Duck类
而鸭子游泳,跑,飞这3个技能都会,所以三个特性都接上
package demomoreinher;public class Duck extends Animal implements ISwimming,IFly,IRunning{public Duck(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println(this.name+"吃鸭粮!");}@Overridepublic void fly() {System.out.println(this.name+"飞~~~");}@Overridepublic void run() {System.out.println(this.name+"跑~~~");}@Overridepublic void swim() {System.out.println(this.name+"游泳~~~");}
}
再加上一个测试
package demomoreinher;public class TestAnimal {public static void eatFunc(Animal animal){animal.eat();//实现eat的动态绑定}public static void walk(IRunning running){running.run();//实现跑的动态绑定}public static void main(String[] args) {walk(new Duck("唐老鸭",3));eatFunc(new Fish("灵儿",2));}
}
测试结果
接口间的继承
相当于将接口合并在一起了
代码理解
IC继承了IA和IB,使IC接口的功能包含了IA和IB的功能,当然类TestDeme在实现接口IC时,要将IA,IB和IC的方法一起都要重写
package demo5;//接口继承问题
interface IA{void testA();
}
interface IB{void testB();
}
//IC接口不仅具备了自己的testC这个功能,还 扩展 了IA和IB的功能
interface IC extends IA,IB{void testC();}
class TestDemo implements IC{@Overridepublic void testA() {System.out.println("testA()");}@Overridepublic void testB() {System.out.println("testB()");}@Overridepublic void testC() {System.out.println("testC()");}
}
相关文章:

【JavaSE】接口 详解(上)
前言 本篇会讲到Java中接口内容,概念和注意点可能比较多,需要耐心多看几遍,我尽可能的使用经典的例子帮助大家理解~ 欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~ 目录 前言 接口 语法…...

嵌入式C基础——循环队列 ringbuffer 讲解
本期主题: 讲解ARRAY_SIZE的作用以及定义,还有一个踩坑分析 往期链接: 数据结构系列——先进先出队列queue数据结构系列——栈 stackLinux内核链表零长度数组的使用inline的作用嵌入式C基础——ARRAY_SIZE使用以及踩坑分析 目录 1. Ringbuff…...

【动态规划-状态压缩dp】【蓝桥杯备考训练】:毕业旅行问题、蒙德里安的梦想、最短Hamilton路径、国际象棋、小国王【已更新完成】
目录 1、毕业旅行问题(今日头条2019笔试题) 2、蒙德里安的梦想(算法竞赛进阶指南) 3、最短Hamilton路径(《算法竞赛进阶指南》&模板) 4、国际象棋(第十二届蓝桥杯省赛第二场C A组/B组&#…...

全坚固笔记本丨工业笔记本丨三防笔记本相较于普通笔记本有哪些优势?
三防笔记本和普通笔记本在设计和性能方面存在显著差异,三防笔记本相较于普通笔记本具备以下优势: 三防笔记本通常采用耐磨、耐摔的材料,并具有坚固的外壳设计,能够承受恶劣环境和意外碰撞,有效保护内部组件不受损坏。相…...

机房搬迁方案
一、项目背景 随着XX公司业务的不断扩展,现有的机房设备已经无法满足日益增长的数据处理需求。同时,考虑到现有机房的设施老化及潜在的安全隐患,XX公司决定进行机房搬迁。本次搬迁旨在确保业务连续性、数据安全性以及新机房的高效运营。 二…...

推动科技创新润德生物邀您到场参观2024第13届生物发酵展
参展企业介绍 山东润德生物科技有限公司成立于2014年10月17日,是一家围绕生物制品的研发、生产、营销、国际贸易、技术服务为核心业务的国家高新技术企业,近年来荣获国家制造业单项冠军示范企业、国家级绿色工厂、国家知识产权优势企业、国家工业产品绿…...

如何在JavaScript中提高性能
在JavaScript中提高性能是一个涉及多个方面的任务,包括代码优化、数据结构选择、异步编程、避免全局查找、内存管理等。以下是一些关键的策略和技巧,可以帮助你提高JavaScript代码的性能: 1. 优化循环 使用for循环代替forEach,特…...

外观模式(面子模式)
外观模式 文章目录 外观模式什么是外观模式示例 什么是外观模式 外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用 Facade 外观类 知道哪些子系统类负责处理请求,将客…...

蓝桥杯考前复习三
1.约数个数 由乘法原理可以得出: import java.util.*; public class Main{static int mod (int)1e9 7;public static void main(String[] args){Map<Integer,Integer> map new HashMap<>(); //创建一个哈希表Scanner scan new Scanner(System.in);i…...

极客时间: 用 Word2Vec, LangChain, Gemma 模拟全本地检索增强生成(RAG)
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...

VBA操作Word
检查word中的字体情况 Sub ListAllFontsInDocument()Dim doc As DocumentDim rng As RangeDim char As RangeDim fontName As StringDim uniqueFonts As Collection 初始化集合用于存储唯一字体名称Set uniqueFonts New Collection 获取当前活动文档Set doc ActiveDocument …...

Linux文件IO(4):目录操作和文件属性获取
目录 1. 前言 2. 函数介绍 2.1 访问目录 – opendir 2.2 访问目录 – readdir 2.3 访问目录 – closedir 2.4 修改文件访问权限 – chmod/fchmod 2.5 获取文件属性 – stat/lstat/fstat 2.5.1 文件属性 – struct stat 2.6 文件类型 – st_mode 3. 代码练习 3.1 要求 3.2 代…...

【C语言】_文件类型,结束判定与文件缓冲区
目录 1. 文本文件和二进制文件 2. 文件读取结束的判定 3. 文件缓冲区 1. 文本文件和二进制文件 根据数据的组织形式,数据文件被称为文本文件或二进制文件; 数据在内存中以二进制的形式存储,如果不加转换地输出到外存,就是二进…...

YOLOV8注意力改进方法:DoubleAttention(附代码)
原论文地址:原论文地址 DoubleAttention网络结构的优点在于,它能够有效地捕获图像中不同位置和不同特征的重要性,从而提高了图像识别和分割的性能。 论文相关内容介绍: 论文摘要:学习捕捉远程关系是图像/视频识别的…...

每日一题 --- 前 K 个高频元素[力扣][Go]
前 K 个高频元素 题目:347. 前 K 个高频元素 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 示例 1: 输入: nums [1,1,1,2,2,3], k 2 输出: [1,2]示例 2: 输入: nums [1], k 1 输出: …...

Rust所有权和Move关键字使用和含义讲解,以及Arc和Mutex使用
Rust 所有权规则 一个值只能被一个变量所拥有,这个变量被称为所有者。 一个值同一时刻只能有一个所有者,也就是说不能有两个变量拥有相同的值。所以对应变量赋值、参数传递、函数返回等行为,旧的所有者会把值的所有权转移给新的所有者&#…...

【YOLOV5 入门】——构建自己的数据集模型训练模型检验
一、准备工作 1、数据收集 图片类型数据不用多说;视频类型数据利用opencv进行抽帧保存为一张张图片,这里选取30s的名侦探柯南片段进行试验,确保环境解释器下安装了opencv(我使用的是另一个虚拟环境): im…...

MacBook 访达使用技巧【mac 入门】
快捷键 打开访达搜索窗口默认快捷键【⌥ ⌘ 空格键】可以在键盘【系统偏好设置 -> 键盘->快捷键->聚焦】修改 但是我不会去修改它,因为我不常用访达的搜索窗口,更多的是想快速打开访达文件夹窗口,可以通过第三方软件定义访达的快…...

常见溯源,反溯源,判断蜜罐手段
常见溯源,反溯源,判断蜜罐手段 1.溯源手段2.反溯源手段3.如何判断蜜罐🍯4.案例:MySQL读文件蜜罐 1.溯源手段 IP地址追踪:通过IP地址追踪可以确定攻击者的地理位置和ISP信息等;通过攻击IP历史解析记录/域名…...

蓝桥杯刷题-09-三国游戏-贪心⭐⭐⭐
蓝桥杯2023年第十四届省赛真题-三国游戏 小蓝正在玩一款游戏。游戏中魏蜀吴三个国家各自拥有一定数量的士兵X, Y, Z (一开始可以认为都为 0 )。游戏有 n 个可能会发生的事件,每个事件之间相互独立且最多只会发生一次,当第 i 个事件发生时会分别让 X, Y,…...

Windows编译运行TensorRT-YOLOv9 (C++)
Windows编译运行yolov9-bytetrack-tensorrt(C) 1 基础环境2 编译yolov9-bytetrack-tensorrt(1)下载yolov9-bytetrack-tensorrt源码(2)修改CMakeLists.txt(3)CMake编译 3 yolov9模型转…...

.NET 设计模式—简单工厂(Simple Factory Pattern)
简介 简单工厂模式(Simple Factory Pattern)属于类的创建型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过一个工厂类来创建对象,根据不同的参数或条件返回相应的对象实例。这种模式隐藏…...

聊聊Linux内核中内存模型
介绍 在Linux中二进制的程序从磁盘加载到内存,运行起来后用户态是使用pid来唯一标识进程,对于内核都是以task_struct表示。二进制程序中的数据段、代码段、堆都能提现在task_struct中。每一个进程都有自己的虚拟地址空间,虚拟地址空间包含几…...

docker自动化部署示例
前提 安装docker 、 docker-cpmpose、git、打包环境(如meaven、jdk、node等) 原理 git Dockerfile docker-compose 获取源码(代码仓库)获取可运行程序的镜像(docker)将打包后的程序放入镜像内…...

Redis精品案例解析:Redis实现持久化主要有两种方式
Redis实现持久化主要有两种方式:RDB(Redis DataBase)和AOF(Append Only File)。这两种方式各有优缺点,适用于不同的使用场景。 1. RDB持久化 RDB持久化是通过创建一个二进制的dump文件来保存当前Redis数据…...

Python | Leetcode Python题解之第14题最长公共前缀
题目: 题解: class Solution:def longestCommonPrefix(self, strs: List[str]) -> str:def isCommonPrefix(length):str0, count strs[0][:length], len(strs)return all(strs[i][:length] str0 for i in range(1, count))if not strs:return &quo…...

烧坏两块单片机,不知道原因?
没有看你的原理图,以下是造成烧毁芯片的几个环节: 1. 最大的可能性是你的单片机电机控制输出与电机驱动电路没有隔离。 我的经验,使用STM32控制电机,无论是直流电机脉宽调制,还是步进电机控制,控制电路与…...

SV学习笔记(八)
文章目录 SV入门练习基本数据类型字符串类型数组类型接口的定义与例化类的封装类的继承package的使用随机约束线程的同步线程的控制虚方法方法(任务与函数)SV用于设计 参考资料 SV入门练习 基本数据类型 有符号无符号、四状态双状态、枚举类型、结构体…...

Java反射常用方法
反射 作用: 对于任意一个对象,把对象所有的字段名和值,保存到文件中去利用反射动态的创造对象和运行方法 1. 获取字节码文件对象 方法描述Class.forName(String)通过类的全限定名字符串获取字节码文件对象。类字面量直接使用类的字面量获…...

go语言实现无头单向链表
什么是无头单向链表 无头单向链表是一种线性数据结构,它的每个元素都是一个节点,每个节点都有一个指向下一个节点的指针。"无头"意味着这个链表没有一个特殊的头节点,链表的第一个节点就是链表的头。 优点: 动态大小&…...