Java interface 接口

接口(interface)

接口的理解

接口就是规范,定义的是一组规则,体现了现实世界中“如果你是/要…则必须能…”的思想。继承是一个"是不是"的is-a关系,而接口实现则是 "能不能"的has-a关系。

接口的本质是契约、标准、规范,就像我们的法律一样。制定好后大家都要遵守。

接口的定义

定义接口的关键字:interface

声明格式:
[修饰符] interface 接口名{//接口的成员列表:// 公共的静态常量// 公共的抽象方法// 公共的默认方法(JDK1.8以上)// 公共的静态方法(JDK1.8以上)// 私有方法(JDK1.9以上)
}
  • 声明属性:必须使用public static final修饰

  • 声明方法: jdk8之前,声明抽象方法,修饰为public abstract

    ​ jkd8: 声明静态方法、默认方法

    ​ jdk9:声明私有方法

    不可以使用interface声明: 构造器、代码块等

interface的使用

接口和类的关系:实现关系

interface Flyable{//接口//全局常量public static final int MIN_SPEED = 0;      //最低速度//可以省略 public static final//自动默认为静态final的常量int MAX_SPEED = 7900;   //最高速度public abstract void fly(); //默认为抽象方法,可以省略public abstract //抽象方法,无方法体
}interface Attackable{//接口public abstract void attack();
}
class Plane implements Flyable,Attackable{//实现Flyable接口//接口中存在抽象方法:① 使用abstract修饰方法,使方法为抽象方法//                ② 重写抽象方法public void fly(){System.out.println("Plane.fly");}@Overridepublic void attack() {System.out.println("Plane.attack");}
}
具体格式:
class A extend SuperA implements B,c{}
//A是SuperA的子类
//A 是 B,C的 实现类
注意点:

一个接口中的所有属性都默认为public final修饰,为常量,赋值后不可更改

一个接口中所有的方法,都为public abstrace修饰,为抽象方法

  • 一个类可以实现多个接口
  • 类针对于接口的多实现,一定程度上就弥补了类的单继承的局限性
  • 一个类实现了一个接口,这个类必须将实现接口中所有的抽象方法进行重写,否则要将此类声明为抽象类

接口和接口的关系:继承关系

使用关键字extends进行继承

interface AA{void method1();	//抽象方法,无方法体
}interface BB{void method2();
}interface CC extends AA,BB{//接口可以多继承}

接口的多态性

接口名 变量名 = new 实现类对象
package interfaceTest;public class UsbTest {public static void main(String[] args) {//1,创建接口实现类的对象Computer computer = new Computer();Printer printer = new Printer();//2.创建接口实现类的匿名对象computer.transferDate(printer);//多态的体现computer.transferDate(new Camera());//3. 创建接口匿名实现类的对象USB usb1 = new USB(){@Overridepublic void start() {System.out.println("U盘开始工作");}@Overridepublic void stop() {System.out.println("U盘停止工作");}};computer.transferDate();}
}class Computer{ //电脑类public void transferDate(USB usb){System.out.println("设备连接成功");usb.start();System.out.println("数据传输细节操作");usb.stop();}
}class Printer implements USB{@Overridepublic void start() {System.out.println("打印机工作");}@Overridepublic void stop() {System.out.println("打印机结束工作");}
}class Camera implements USB{@Overridepublic void start() {System.out.println("照相机工作");}@Overridepublic void stop() {System.out.println("照相机结束工作");}
}
interface USB{//声明常量  省略public abstract void start();void stop();
}

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

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

相关文章

重新夺回控制权!原创始人从Synk回购FossID,致力于解决开源许可合规风险

FossID 于 2022 年 9 月被其原始创始人从 Snyk, Inc. 重新收购。为什么 Snyk 在 2021 年收购了 FossID,又在 2022 年将其分拆,以及为什么 FossID 的创始人(Oskar Swirtun 和 Jon Aldama)后来又回购了该公司? 公司背景 …

代码随想录算法训练营Day48 | 121. 买卖股票的最佳时机 122.买卖股票的最佳时机II

代码随想录算法训练营Day48 | 121. 买卖股票的最佳时机 122.买卖股票的最佳时机II LeetCode 121. 买卖股票的最佳时机 题目链接:LeetCode 121. 买卖股票的最佳时机 思路: 取左边最小,更新右边最大。 class Solution { public:int maxProf…

YOLOv8_seg的训练、验证、预测及导出[实例分割实践篇]

实例分割数据集链接,还是和目标检测篇一样,从coco2017val数据集中挑出来person和surfboard两类:链接:百度网盘 请输入提取码 提取码:3xmm 1.实例分割数据划分及配置 1.1实例分割数据划分 从上面得到的数据还不能够直接训练,需要按照一定的比例划分训练集和验证集,并按…

Servlet的response对象

目录 HTTP响应报文协议 reponse继承体系 reponse的方法 响应行 public void setStatus(int sc) 响应头 public void setHeader(String name, String value) 响应体 public java.io.PrintWriter getWriter() public ServletOutputStream getOutputStream() 请求重定…

【GUI开发基础】

GUI开发基础 🌟项目文件组成✨浅析Pro文件配置 🌟Qt设计师🌟剖析UI文件运行机制🌟UI设计方式✨可视化UI设计✨代码化UI设计 🌟项目文件组成 创建一个QtGUI项目: open QtCreator —> select Creator Pr…

C语言如果变量全部在全局内存空间会怎么样

结论先行 应该根据内存使用的生命周期,选择合适的内存空间应该尽量使用连续内存如果不想在设计封装性上付出太多代价,全部放入全局空间也比较可取 空间类型特点全局空间生命周期最久,空间连续,变量分配紧致,但存在浪…

You must call removeView() on the child‘s parent first.异常分析及解决

问题描述 对试图组件快速的左右滑动过程,发现某一张图片没加载出来,偶现crash 问题分析 view在上次已经是某个ParentView的child,然而现在又把它做为另外一个view的child,于是出现一个view有两个parent。所以就产生了这个错误。…

创新工具|AI革新内容营销:策略、工具与实施指南

探索如何利用人工智能(AI)提升内容营销策略,从SEO优化到个性化推荐。本指南详细介绍了11款顶尖AI工具,旨在帮助中国的中高级职场人士、创业家及创新精英高效地策划和生成引人入胜的内容,同时确保内容的专业性、权威性和…

2.OpenFeign 入门与使用

2.OpenFeign 入门与使用 1.什么是 OpenFeign?2.OpenFeign 基础使用2.1 添加依赖2.2 配置 Nacos 服务端信息2.3 项目中开启 OpenFeign2.4 编写 OpenFeign 调用代码2.5 调用 OpenFeign 接口代码 3.超时重试机制3.1 配置超时重试3.2 覆盖 Retryer 4.自定义超时重试机制4.1 自定义…

vue 使用 export default

<script>export default {data() {return {x1: undefined,x2: [],x3: {}}},methods: {t1() {...},t2() {}}} </script> export default是ES6的语法&#xff0c;意思是将这个东西导出&#xff0c;你要import 引入东西&#xff0c;导出了才能引用&#xff0c;data是…

golang通过go-aci适配神通数据库

1. go-aci简介 go-aci是神通数据库基于ACI(兼容Oracle的OCI)开发的go语言开发接口&#xff0c;因此运行时需要依赖ACI驱动和ACI库的头文件。支持各种数据类型的读写、支持参数绑定、支持游标范围等操作。 2. Linux部署步骤 2.1. Go安装&#xff1a; 版本&#xff1a;1.9以上…

Java面向对象程序设计-对象数组的 for each 循环

这是翁恺老师课程3.2.2对象数组中的示例代码&#xff1a; class Value{private int i;public void set(int i){this.ii;}public int get(){return i;} }public class NoteBook {public static void main(String[] args) {Value[] a new Value[10];for (int i 0; i < a.…

【从C++到Java一周速成】章节14:网络编程

章节14&#xff1a;网络编程 【1】网络编程的概念【2】IP地址与端口的概念【3】网络通信协议引入网络通信协议的分层 【3】Socket套接字【4】单向通信【5】双向通信 【1】网络编程的概念 把分布在不同地理区域的计算机与专门的外部设备用通信线路互联成一个规模大、功能强的网…

头歌openGauss-存储过程第2关:修改存储过程

任务描述 本关任务&#xff1a; 修改存储过程pro0101&#xff0c;并调用&#xff1b; --修改sel_course表中成绩<60的记录为成绩10&#xff0c;然后将计算机学院所有学生的选课成绩输出&#xff1b; --a、需要先删除存储过程pro0101&#xff1b; drop procedure if exists p…

LLM 入门与实践(三)Baichuan2 部署与分析

本文截取自20万字的《PyTorch实用教程》&#xff08;第二版&#xff09;&#xff0c;敬请关注&#xff1a;《Pytorch实用教程》&#xff08;第二版&#xff09;《Pytorch实用教程》&#xff08;第二版&#xff09;无论是零基础入门&#xff0c;还是CV、NLP、LLM项目应用&#x…

Python协程的作用

过分揣测别人的想法&#xff0c;就会失去自己的立场。大家好&#xff0c;当代软件开发领域中&#xff0c;异步编程已成为一种不可或缺的技术&#xff0c;用于处理大规模数据处理、高并发网络请求、实时通信等应用场景。而Python协程&#xff08;Coroutine&#xff09;作为一种高…

【译】MySQL 组复制 - 部分网络故障对性能的影响

原文地址&#xff1a;MySQL Group Replication – Partial Network Failure Performance Impact 在这个由两部分组成的博客系列中&#xff0c;我想介绍一些使用组复制的故障转移场景。在第一部分中&#xff0c;我将讨论我在撰写这些文章时发现的一种有趣的行为和性能下降。在第…

C#学习指南:重要内容与实用技巧

学习C#编程是一段充满挑战但又非常充实的旅程。以下是我在学习过程中积累的一些经验&#xff0c;希望能对大家有所帮助。 一、掌握基础概念 类及其成员 C#中的类是编程的基础模块。理解类的结构、属性、方法和构造函数是至关重要的。每个类都有其特定的功能&#xff0c;学会如…

力扣HOT100 - 169. 多数元素

解题思路&#xff1a; 有点类似于Boyer-Moore 投票算法&#xff0c;但更加形象。 class Solution {public int majorityElement(int[] nums) {int winner nums[0];int cnt 1;for (int i 1; i < nums.length; i) {if (winner nums[i]){cnt;} else if (cn…

【JavaScript寻宝之旅】var和let的区别

前言 在JavaScript中&#xff0c;let和 var 都是用来声明变量的关键字 let 和 var 的区别 作用域: var 声明的变量具有函数作用域&#xff08;function scope&#xff09;。如果在一个函数内部声明&#xff0c;它只在该函数内部可见。如果在一个函数外部声明&#xff0c;它会…