第一百一十八节 Java面向对象设计 - Java接口
Java面向对象设计 - Java接口
什么是接口?
Java中的接口定义了一个引用类型来创建抽象概念。接口由类实现以提供概念的实现。
在Java 8之前,一个接口只能包含抽象方法。 Java 8允许接口具有实现的静态和默认方法。
接口通过抽象概念定义不相关类之间的关系。
例如,我们可以创建一个Person类来表示一个人,我们可以创建一个Dog类来表示一只狗。
人和狗都可以走路。这里的步行是一个抽象的概念。狗可以走,人也是这样。这里我们可以创建一个名为Walkable的接口来表示walk的概念。然后我们可以有Person类和Dog类来实现Walkable概念并提供自己的实现。 Person类实现了Walkable接口,并使人以人的方式走路。Dog类可以实现Walkable界面,使狗以狗的方式走路。
例子
在下面我们将使用一个例子来说明为什么我们需要接口。
假设 Person
类有一个walk()方法。
public interface Walkable {void walk(); }class Person implements Walkable {public Person() {}public void walk() {System.out.println("a person is walking.");} } class Dog implements Walkable {public Dog() {}public void walk() {System.out.println("a dog is walking.");} }
类可以在其声明中使用关键字implements实现一个或多个接口。
通过实现一个接口,类保证它将为接口中声明的所有方法提供一个实现,或者类将自己声明为抽象。
如果一个类实现了Walkable接口,它必须提供walk()方法的实现。
像类一样,接口定义了一个新的引用类型。
当定义一个新的接口(例如,Walkable)时,我们定义一个新的参考接口类型。
以下声明有效:
Walkable w; // w is a reference variable of type Walkable
您不能创建接口类型的对象,因为接口是定义抽象概念。以下代码无效:
new Walkable(); // A compile-time error
我们可以为一个类类型创建一个对象,但是我们可以使用一个接口类型变量来引用其类实现该接口的任何对象。
因为Person和Dog类实现了Walkable接口,所以Walkable类型的引用变量可以引用这些类的对象。
Walkable w1 = new Person(); // OK Walkable w2 = new Dog(); // OK
我们可以使用它的引用类型变量访问接口的任何成员。由于Walkable接口只有一个成员,这是walk()方法,我们可以编写如下代码:
// Let the person walk w1.walk(); // Let the dog walk w2.walk();
当调用w1上的walk()方法时,它调用Person对象的walk()方法,因为w1指的是Person对象。
当调用w2上的walk()方法时,它调用Dog对象的walk()方法,因为w2指的是Dog对象。
当使用接口类型的引用变量调用方法时,它调用它所引用的对象上的方法。
例2
下面的代码创建了一个方法来使用interface我们的参数类型。
public class Main{public static void main(String[] args) {Walkable[] w = new Walkable[2];w[0] = new Person();w[1] = new Dog();Walkables.letThemWalk(w);} }class Walkables {public static void letThemWalk(Walkable[] list) {for (Walkable w : list) {w.walk();}} }
声明接口
声明接口的一般语法是
<modifiers> interface <interface-name> { Constant-DeclarationMethod-DeclarationNested-Type-Declaration }
接口声明以修饰符列表开头,可能为空。
像类一样,一个接口可以有一个公共或包级别的作用域。
关键字public用于指示接口具有公共范围。
缺少范围修饰符指示接口具有包级别作用域。具有包级别作用域的接口只能在其包的成员内引用。
关键字interface用于声明接口,后面是接口的名称。
接口的名称必须是有效的Java标识符。
接口体跟在其名称后面并放在大括号内。
接口的主体可以为空。以下是最简单的接口声明:
package com.w3cschool;interface Updatable {// The interface body is empty }
像类一样,一个接口有一个简单的名称和一个完全限定名。关键字interface后面的标识符是其简单名称。
接口的完全限定名称通过使用其包名称和用点分隔的简单名称形成。
在上面的示例中,Updatable是简单的名称,com.java2s.Updatable是完全限定名称。
使用接口的简单和完全限定名的规则与类的规则相同。
下面的代码声明一个名为ReadOnly的接口。它有一个公共范围。
package com.w3cschool;public interface ReadOnly {// The interface body is empty }
接口声明总是抽象的,无论是否明确声明它是抽象的。
标记接口
标记接口是没有成员的接口。
标记接口标记具有特殊含义的类。
interface Shape { } class Circle implements Shape{ }Shape c = new Circle();if (c instanceof Shape) {System.out.println("Using a Shape object"); }
Java API有许多标记接口。 java.lang.Cloneable,java.io.Serializable和java.rmi.Remote都是标记接口。
功能接口
仅具有一个抽象方法的接口被称为功能接口。
多态性 - 一个对象,多个视图
多态性是指对象具有多种形式的能力。
多态性是对象提供其不同视图的能力。
接口让我们创建一个多态对象。
相关文章:
第一百一十八节 Java面向对象设计 - Java接口
Java面向对象设计 - Java接口 什么是接口? Java中的接口定义了一个引用类型来创建抽象概念。接口由类实现以提供概念的实现。 在Java 8之前,一个接口只能包含抽象方法。 Java 8允许接口具有实现的静态和默认方法。 接口通过抽象概念定义不相关类之间…...
Flink nc -l -p 监听端口测试
1、9999端口未占用 netstat -apn|grep 99992、消息发送端 nc -l -k -p 9999 {"user":"ming","url":"www.baidu1.com", "timestamp":1200L, "score":1} {"user":"xiaohu","url":…...
在IntelliJ IDEA中使用Spring Boot:快速配置
使用IntelliJ IDEA开发Spring Boot应用程序可以极大地提高开发效率,因为IDEA提供了许多便捷的功能,比如自动补全、代码分析、热部署等。以下是一篇可能的CSDN博客文章草稿,介绍如何在IntelliJ IDEA中使用Spring Boot: 在IntelliJ …...
django filter 批量修改
django filter 批量修改 在Django中,如果你想要批量修改记录,可以使用update()方法。这个方法允许你在一个查询集上执行批量更新,而不需要为每条记录生成单独的数据库事务。 以下是一个使用update()方法批量修改记录的例子: fro…...

maven:中央仓库验证方式改变:401 Content access is protected by token
前几天向maven中央仓库发布版本,执行上传命令mvn release:perform时报错了: [ERROR] Failed to execute goal org.sonatype.plugins:nexus-staging-maven-plugin:1.6.13:deploy (injected-nexus-deploy) on project xxxxx: Failed to deploy artifacts: …...
【面试】http
一、定义 HTTP(超文本传输协议),是一种用于分布式、协作式、超媒体信息系统的应用层协议,它是万维网数据通信的基础。主要特点是无状态(服务器不会保存之前请求的状态)、无连接(服务器处理完请…...

获取泛型,泛型擦除,TypeReference 原理分析
说明 author blog.jellyfishmix.com / JellyfishMIX - githubLICENSE GPL-2.0 获取泛型,泛型擦除 下图中示例代码是一个工具类用于生成 csv 文件,需要拿到数据的类型,使用反射感知数据类型的字段,来填充表字段名。可以看到泛型…...

springboot 3.x 之 集成rabbitmq实现动态发送消息给不同的队列
背景 实际项目中遇到针对不同类型的消息,发送消息到不同的队列,而且队列可能还不存在,需要动态创建,于是写了如下代码,实践发现没啥问题,这里分享下。 环境 springboot 3.2 JDK 17 rabbitMQ模型介绍 图片…...
C++ 代码实现鼠标右键注册菜单,一级目录和二级目录方法
最近做的一个项目, 在使用windows的时候,我希望在右键菜单中添加一个自定义的选项, 该选项下有我经常使用的多个程序快捷方式, 直接上代码 头文件 #pragma once #include <Windows.h> #include <iostream> #include <string> using namespace std; …...

SQLite 3 优化批量数据存储操作---事务transaction机制
0、事务操作 事务的目的是为了保证数据的一致性和完整性。 事务(Transaction)具有以下四个标准属性,通常根据首字母缩写为 ACID: 原子性(Atomicity):确保工作单位内的所有操作都成功完成&…...
[程序员] 表达的能力
之前看CSDN的问答区,很多时候,感觉问题的描述所要表达的意思非常模糊,或者说描述不清。如果是想回答问题的人想回答问题,首先要搞清楚是什么问题,就需要再问问题主很多细节的东西。三来四去,才能搞清楚具体…...

rknn转换后精度差异很大,失真算子自纠
下面是添加了详细注释的优化代码: import cv2 import numpy as np import onnx import onnxruntime as rt from onnx import helper, shape_inferencedef get_all_node_names(model):"""获取模型中所有节点的名称。参数:model (onnx.ModelProto): O…...

【C语言】解决C语言报错:Stack Overflow
文章目录 简介什么是Stack OverflowStack Overflow的常见原因如何检测和调试Stack Overflow解决Stack Overflow的最佳实践详细实例解析示例1:递归调用过深示例2:分配过大的局部变量示例3:嵌套函数调用过多 进一步阅读和参考资料总结 简介 St…...

【滚动哈希 二分查找】1044. 最长重复子串
本文涉及知识点 滚动哈希 二分查找算法合集 LeetCode 1044. 最长重复子串 给你一个字符串 s ,考虑其所有 重复子串 :即 s 的(连续)子串,在 s 中出现 2 次或更多次。这些出现之间可能存在重叠。 返回 任意一个 可能具…...
webid、sec_poison_id、a1、web_session参数分析与算法实现
文章目录 1. 写在前面2. 参数分析3. 核心算法【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python与爬虫领域研究与开发工作! 【🌟作者推荐】:对爬…...
Qt|QWebSocket与Web进行通讯,实时接收语音流
实现功能主要思路:在网页端进行语音输入,PC机可以实时接收并播放语音流。 此时,Qt程序做客户端,Web端做服务器,使用QWebSocket进行通讯,实时播放接收的语音流。 功能实现 想要实现该功能,需要…...

「51媒体」电视台媒体邀约采访报道怎么做?
传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 电视台作为地方主流媒体,对于新闻报道有着严格的选题标准和报道流程。如果您希望电视台对某个会议或活动进行报道,可以按这样的方法来做: 1.明确活动信…...

Python提取PDF文本和图片,以及提前PDF页面中指定矩形区域的文本
前言 从PDF中提取内容能帮助我们获取文件中的信息,以便进行进一步的分析和处理。此外,在遇到类似项目时,提取出来的文本或图片也能再次利用。要在Python中通过代码提取PDF文件中的文本和图片,可以使用 Spire.PDF for Python 这个…...

C#实现边缘锐化(图像处理)
在 C# 中进行图像的边缘锐化,可以通过卷积滤波器实现。边缘锐化的基本思想是通过卷积核(也称为滤波器或掩模)来增强图像中的边缘。我们可以使用一个简单的锐化核,例如: [ 0, -1, 0][-1, 5, -1][ 0, -1, 0]这个卷积核…...

ffmpeg windows系统详细教程
视频做预览时黑屏,但有声音问题解决方案。 需要将 .mp4编成H.264格式的.mp4 一般上传视频的站点,如YouTube、Vimeo 等,通常会在用户上传视频时自动对视频进行转码,以确保视频能够在各种设备和网络条件下流畅播放。这些网站通常…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...

Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...

沙箱虚拟化技术虚拟机容器之间的关系详解
问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西,但是如果把三者放在一起,它们之间到底什么关系?又有什么联系呢?我不是很明白!!! 就比如说: 沙箱&#…...