【JavaSE】接口

文章目录

  • 接口的概念
  • 接口的使用
  • 接口的特性
  • 实现多个接口
  • 接口间的继承
  • 抽象类和接口的区别

接口的概念

接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用。在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型。接口的定义格式与定义类的格式基本相同,将class关键字换成 interface 关键字,就定义了一个接口。

public interface 接口名称{// 抽象方法public abstract void method1(); // public abstract 是固定搭配,可以不写public void method2();abstract void method3();void method4();// 注意:在接口中上述写法都是抽象方法,更推荐方式4,代码更简洁
}

建议:
1.创建接口时,接口的命名一般以大写字母 I 开头。
2.接口的命名一般使用 “形容词” 词性的单词。
3.阿里编码规范中约定,接口中的方法和属性不要加任何修饰符号,保持代码的简洁性。

接口的使用

接口不能直接使用,必须要有一个"实现类"来"实现"该接口,实现接口中的所有抽象方法。

public class 类名 implements 接口名{// ...
}

注意:子类和父类之间是extends 继承关系,类与接口之间是implements 实现关系。
示例:
请实现笔记本电脑使用USB鼠标、USB键盘的例子
1.USB接口:包含打开设备、关闭设备功能
2.笔记本类:包含开机功能、关机功能、使用USB设备功能
3.鼠标类:实现USB接口,并具备点击功能
4.键盘类:实现USB接口,并具备输入功能
创建USB接口

public interface USB {void openDevice();void closeDevice();
}

创建鼠标类Mouse,实现USB接口

public class Mouse implements USB {@Overridepublic void openDevice() {System.out.println("打开鼠标");}@Overridepublic void closeDevice() {System.out.println("关闭鼠标");}public void click(){System.out.println("鼠标点击");}
} 

创建键盘类KeyBoard,实现USB接口

public class KeyBoard implements USB {@Overridepublic void openDevice() {System.out.println("打开键盘");} @Overridepublic void closeDevice() {System.out.println("关闭键盘");}public void inPut(){System.out.println("键盘输入");}
}

创建笔记本类Computer,使用USB设备

public class Computer {public void powerOn(){System.out.println("打开笔记本电脑");}public void powerOff(){System.out.println("关闭笔记本电脑");}public void useDevice(USB usb){usb.openDevice();if(usb instanceof Mouse){Mouse mouse = (Mouse)usb;mouse.click();}else if(usb instanceof KeyBoard){KeyBoard keyBoard = (KeyBoard)usb;keyBoard.inPut();} usb.closeDevice();}
}

创建测试类TestUSB

public class TestUSB {public static void main(String[] args) {Computer computer = new Computer();computer.powerOn();// 使用鼠标设备computer.useDevice(new Mouse());// 使用键盘设备computer.useDevice(new KeyBoard());computer.powerOff();}
}

接口的特性

接口类型是一种引用类型,但是不能直接new接口的对象。

public class TestUSB {public static void main(String[] args) {USB usb = new USB();//error USB是抽象的 无法实例化}
}

接口中每一个方法都是public的抽象方法,即接口中的方法会被隐式的指定为 public abstract(只能是public abstract,其他修饰符都会报错)

public interface USB {private void openDevice();// error 此处不允许使用privatevoid closeDevice();
}

接口中的方法是不能在接口中实现的,只能由实现接口的类来实现。

public interface USB {void openDevice();// 编译失败:因为接口中的方式默认为抽象方法// error 接口抽象方法不能带有主体void closeDevice(){System.out.println("关闭USB设备");}
}

重写接口中方法时,不能使用默认的访问权限。

public interface USB {void openDevice(); // 默认是public的void closeDevice(); // 默认是public的
}public class Mouse implements USB {@Overridevoid openDevice() {  //errorSystem.out.println("打开鼠标");}
} 

接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量。

public interface USB {double brand = 3.0; // 默认被:final public static修饰void openDevice();void closeDevice();
}public class TestUSB {public static void main(String[] args) {// 可以直接通过接口名访问,说明是静态的System.out.println(USB.brand); // 编译报错:error 无法为最终变量brand分配值USB.brand = 2.0; // 说明brand具有final属性}
}

接口中不能有代码块和构造方法

public interface USB {public USB(){} // 编译失败{} // 编译失败static {} // 编译失败void openDevice();void closeDevice();
}

接口虽然不是类,但是接口编译完成后字节码文件的后缀格式也是 .class。如果类没有实现接口中的所有的抽象方法,则类必须设置为抽象类。 jdk8中,接口中还可以包含default方法。

public interface ITest {//一定要被重写void testA(); //static修饰不能被重写static void testStatic() {System.out.println("testStatic()");}//default修饰可以被重写也可以不被重写default void defaultMethod() {System.out.println("defaultMethod()");}
}class TestDemo implements ITest {@Overridepublic void testA() {System.out.println("重写testA()!");}
}

实现多个接口

Java中不支持多继承,但是一个类可以实现多个接口。
定义一个Animal的类

public class Animal {String name;public Animal(String name) {this.name = name;}
}

提供两个接口 Run 和 Fly

public interface Run {void running();
}
public interface Fly {void flying();
}

创建一个Bird

public class Bird extends Animal implements Run,Fly {public Bird(String name) {super(name);}@Overridepublic void flying() {System.out.println(name + "在飞翔");}@Overridepublic void running() {System.out.println(name + "在跑");}
}

创建一个Dog

public class Dog extends Animal implements Run {public Dog(String name) {super(name);}@Overridepublic void running() {System.out.println(name + "在飞快地跑");}
}

最后创建一个测试类TestInterface

public class TestInterface {public static void main(String[] args) {Dog dog = new Dog("大黑");Bird bird = new Bird("小白");dog.running();bird.running();bird.flying();}
}

注意:一个类实现多个接口时,每个接口中的抽象方法都要实现,否则类必须设置为抽象类。

接口间的继承

在Java中,类和类之间是单继承的,一个类可以实现多个接口,接口与接口之间可以多继承。即:用接口可以达到多继承的目的。接口可以继承一个接口, 达到复用的效果. 使用 extends 关键字。

interface IRunning {void run();
} 
interface ISwimming {void swim();
} 
// 两栖动物, 既能跑, 也能游
interface IAmphibious extends IRunning, ISwimming {
}

接口间的继承相当于把多个接口合并在一起。

抽象类和接口的区别

核心区别:抽象类中可以包含普通方法和普通字段,这样的普通方法和字段可以被子类直接使用(不必重写),而接口中不能包含普通方法,子类必须重写所有的抽象方法。

区别抽象类(abstract)接口(interface)
结构组成普通类+抽象方法抽象方法+全局常量
权限各种权限public
子类使用使用extends关键字继承抽象类使用implements关键字实现接口
子类限制一个子类只能继承一个抽象类一个子类可以实现多个接口
关系一个抽象类可以实现若干接口接口不能继承抽象类,但是接口可以使用extends关键字继承多个接口

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

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

相关文章

Spring核心配置步骤-完全基于XML的配置

Spring框架的核心配置涉及多个方面,包括依赖注入(DI)、面向切面编程(AOP)等。以下是一般情况下配置Spring应用程序的核心步骤: 1. **引入Spring依赖:** 在项目的构建工具(如Maven、…

23 WEB漏洞-文件上传之解析漏洞编辑器安全

目录 几种中间件解析漏洞简要演示几种常见WEB编辑器简要演示几种常见CMS文件上传简要演示贴近实际应用下的以上知识点演示 各个WEB编辑器安全讲解 https://navisec.it/编辑器漏洞手册/ 各个CMS文件上传简要讲解 wordpress,phpcms, 几种中间件解析漏洞简…

JDK 新版本中都有哪些新特性?

面试回答 JDK 8 推出了 Lambda 表达式、Stream、Optional、新的日期 API 等 JDK 9 中推出了模块化 JDK 10 中推出了本地变量类型推断 JDK 12 中增加了 switch 表达式 JDK 13 中增加了 text block JDK 14 中增加了 Records JDK 15 中增加了封闭类 JDK 17 中扩展了 switch…

探索未知世界:桌面端3D GIS引领地理信息新时代

近年来,桌面端的三维地理信息系统(3D GIS)在地理信息领域迎来了显著的发展,为我们带来了更深入、更丰富的地理空间认知和数据分析体验。从城市规划到环境保护,从资源管理到应急响应,桌面端的3D GIS正逐渐成…

Mysql定时备份事件

创建了一个名为backup_database的定时任务,每天自动在当前时间的后一天开始执行。备份数据库的代码使用mysqldump命令将数据库导出为sql文件保存在指定的备份目录中。 需要注意的是,上述代码中的用户名 (username)、密码 (password)、主机名 (hostname) …

Java程序设计——在一个给定的字符串中查找并解析姓名、出生日期、个人网站、身高和体重信息,并输出相应的结果

package ch4;public class FindMess {public static void main(String[] args) {String mess "姓名:张三 出生时间:1989.10.16。个人网站:http://www.zhang.com。身高:185 cm,体重:72 kg";int index (int)(mess.indexOf(":")); //mess调用indexOf(Stri…

如何解决跨域问题

跨域问题是指在浏览器中发起跨域请求时,由于浏览器的同源策略限制,导致请求被拒绝或无法正常发送和接收数据。同源策略要求两个页面具有相同的协议、域名和端口号,否则就会出现跨域问题。 为了解决跨域问题,可以采取以下方法之一…

git Update failed cannot lock ref

报错详情 解决方案 百度了很多方案,过滤出了有效方案 去该项目下的.git文件里找到报错文件,本例中即为:.git/refs/tags/pre-RELEASE-PRE-20230817-03 删除该文件,重新pull,pull成功问题解决

Java并发工具类

JDK并发包中常用并发工具类: CountDownLatch、CyclicBarrier和Semaphore工具类提供了一种并发流程控制的手段; Exchanger工具类则提供了在线程间交换数据的一种手段。 等待多线程完成的CountDownLatch CountDownLatch允许一个或多个线程等待其他线程完成…

Electron学习3 使用serialport操作串口

Electron学习3 使用serialport操作串口 一、准备工作二、 SerialPort 介绍1. 核心软件包(1) serialport(2) serialport/stream(3) serialport/bindings-cpp(4) serialport/binding-mock(5) serialport/bindings-interface 2. 解析器包3. 命令行工具 三、创建一个demo程序1. 创建…

NOI2015D. 荷马史诗

荷马史诗 题目描述 追逐影子的人,自己就是影子。 ——荷马 Allison 最近迷上了文学。她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的《荷马史诗》。但是由《奥德赛》和《伊利亚特》组成的鸿篇巨制《荷马史诗》实在是…

Dapper

介绍 dapper是一款轻量级的ORM Dapper 被称为 ORM 之王。 以下是 Dapper 的主要功能: 速度快,性能快。 更少的代码行。 对象映射器。 静态对象绑定。 动态对象绑定。 轻松处理 SQL 查询。 易于处理存储过程。 直接对 IDBConnection 类进行操作&#xf…

重注微电子产业,“三大齿轮”能否带起香港经济的“第三轮”

文 | 智能相对论 作者 | 佘凯文 众所周知,微电子产业早已成为现代科技领域的关键钥匙,谁能掌握微电子产业,谁就能拥有全球科技领域的话语权。 从上世纪开始,微电子产业曾经历过几次重大转移,如70年代从美国转向日本…

零拷贝技术详解

当涉及到网络编程和IO操作时,数据拷贝是一个常见的性能瓶颈。传统的数据拷贝过程中,数据需要从内核缓冲区复制到用户空间缓冲区,然后再从用户空间缓冲区复制到内核缓冲区,这个过程会耗费大量的CPU时间和内存带宽,降低系…

tensorRT安装

官方指导文档:Installation Guide :: NVIDIA Deep Learning TensorRT Documentation 适配很重要!!!! 需要cuda, cuDNN, tensorRT三者匹配。我的cuda11.3 所以对应的cuDNN和tensorRT下载的是如下版本: cud…

【业务功能篇77】微服务-OSS对象存储-上传下载图片

3. 图片管理 文件存储的几种方式 单体架构可以直接把图片存储在服务器中 但是在分布式环境下面直接存储在WEB服务器中的方式就不可取了,这时我们需要搭建独立的文件存储服务器。 3.1 开通阿里云服务 针对本系统中的相关的文件,图片,文本等…

docker 安装操作

1.安装docker服务,配置镜像加速器 安装软件包[rootbogon ~]# yum install -y yum-utils device-mapper-persistent-data lvm2 设置yum源 [rootbogon ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 安装 […

python爬虫爬取中关村在线电脑以及参数数据

一. 内容简介 python爬虫爬取中关村在线电脑以及参数数据 二. 软件环境 2.1vsCode 2.2Anaconda version: conda 22.9.0 三.主要流程 3.1 代码 解析都在代码里面 # 接口分析 # 原始接口,后面几个数字就是占位的,每个位置代表着不同的标签 # http…

07-Numpy基础-伪随机数生成

numpy.random模块对Python内置的random进行了补充,增加了一些用于高效生成多种概率分布的样本值的函数。 例如,你可以用normal来得到一个标准正态分布的44样本数组: 而Python内置的random模块则只能一次生成一个样本值。从下面的测试结果中可…

Mybatis查询一条数据

上一篇我们介绍了在pom文件中引入mybatis依赖,配置了mybatis配置文件,通过读取配置文件创建了会话工厂,使用会话工厂创建会话获取连接对象读取到了数据库的基本信息。 如果您需要对上面的内容进行了解,可以参考Mybatis引入与使用…