Java学习笔记004——接口概念理解及意义
一个类中有抽象方法,则必须声明为abstract(做为抽象类),抽象类不能实例化。子类继承抽象类,必须对所有的抽象方法重写,否则依然有抽象方法,还是抽象的,无法实例化。故抽象类常做为基类。
一个类中所有方法都是抽象方法,那么该类就可以使用接口来实现。
在Java语言中,接口(interface)默认是公开的(public)。这意味着,当你定义一个接口时,你不需要显式地将其声明为public,它默认就是public的。
例如,以下两种定义方式是等效的:
public interface MyInterface {
void myMethod();
}
interface MyInterface {
void myMethod();
}
在第二种情况下,虽然没有在接口前加上public关键字,但接口仍然默认是public的。
请注意,接口内的常量(常量成员变量)和方法默认是public static和public abstract的,这意味着可以直接通过接口名来访问它们,而不需要创建接口的实例。可以显式地给这些常量和方法添加public关键字,但这并不是必需的,因为它们是默认公开的。
例如,以下两种定义方式是等效的:
public interface MyInterface {
public static final int MY_CONSTANT = 10;
public abstract void myMethod();
}
interface MyInterface {
static final int MY_CONSTANT = 10;
abstract void myMethod();
}
另外,虽然Java语言允许你显式地在接口上使用public关键字,但实际上,由于接口默认是public的,这些显式声明通常是不必要的。
在Java编程语言中,接口(Interface)是一个非常重要的概念,具有多重意义。以下是接口在Java中的主要意义:
- 定义行为规范:接口定义了一组方法,这些方法由实现该接口的类来提供具体实现。这提供了一种机制,允许类遵循特定的行为规范或契约,而无需知道实现这些方法的具体细节。
- 实现多态:接口是实现多态性的关键工具之一。通过接口,我们可以创建一个接口类型的引用,该引用可以指向实现该接口的任何类的对象。这使得我们可以在不修改现有代码的情况下,将新的实现添加到系统中,从而增强了系统的可扩展性。
- 解耦:接口有助于降低类之间的耦合度。通过将功能划分为独立的接口,我们可以减少类之间的直接依赖关系,从而使代码更易于维护、测试和重用。
- 抽象:接口提供了一种抽象机制,允许我们只关注对象的行为,而不是其具体实现。这有助于我们创建更通用、更灵活的代码。
- 实现代码重用:多个类可以实现同一个接口,这意味着它们可以共享相同的方法签名。这有助于减少代码冗余,提高代码重用性。
- 支持回调:接口经常用于实现回调机制,即允许一个对象在某个事件发生时调用另一个对象的方法。这在事件驱动编程中非常常见,例如当用户点击按钮或触发其他事件时,程序会调用相应的回调函数。
总结:
(1)接口中的所有方法都是public abstact;
(2)与public 类一样,接口也必须定义在与接口同名的.java文件中;
(3)在接口中声明方法时,不能使用native、final、synchronized、protected等说明符。
(4)与类的继承不同的是,要使用接口,需要编写一个类去实现该接口,使用implements关键字,而不是extends,并要给出接口中的所有方法的具体实现。
(5)Java要求:在覆盖或者实现方法时,覆盖或者实现的方法设置的访问权限必须高于或等于被覆盖或实现的访问权限。方法的4种访问说明符的访问权限从高到低分别是:public、protected、default(不加访问说明符时)、private。接口中的所有方法都是public访问权限,因此在实现接口时,方法的访问权限只能是public。
(6)接口与抽象类的区别是:接口只是定义了实现它的类应该用什么方法,相当于为类的实现制定了一个规约;而抽象类除了抽象方法外,还可以定义一些方法的默认实现。如何在抽象类与接口间取舍呢?当需要一个公共实现来简化子类的创建时,使用抽象类比较合适。如果是对外提供一个统一的操作模型,则使用接口更加合适。
(7)接口中的数据成员默认都是public(公共的)、static(静态)的常量,因此在接口中声明时可以省略public static final。接口中的静态常量通过“接口名称.常量名称”的方式进行访问。如下面代码Week.java文件中定义的接口Week。可以使用Week.FRIDAY,如果某个类实现了这个接口,也可以这个类名来访问(“实现接口的类名.接口中定义的常量名”)。当然,在接口或者实现接口的类内部访问静态常量,直接访问即可。
package com.test;public interface Week {int SUNDAY = 0; //等价于public static final int SUNDAY = 0; 下同int MONDAY = 1;int TUESDAY = 2;int WEDNESDAY = 3;int THURSDAY = 4;int FRIDAY = 5;int SATURDAY = 5;}class DoSomethingWithWeek implements Week {void doWeek(int day) {switch (day) {case SUNDAY:System.out.println("星期天");break;case MONDAY:System.out.println("星期一");break;}}public static void main(String[] args) {// 实现接口的类中,使用接口中定义的常量的集中方式System.out.println(Week.SUNDAY); // 使用"接口名.常量名称"方式使用接口中的常量System.out.println(SUNDAY); // 直接使用“常量名”System.out.println(DoSomethingWithWeek.SUNDAY); // 使用"实现接口的类名.常量名称"方式使用接口中的常量DoSomethingWithWeek d = new DoSomethingWithWeek(); // 创建实现接口的类的实例d.doWeek(SUNDAY); // 在类的方法中使用接口中的常量}
}
(8)当一个类实现一个接口时,它必须提供该接口中所有抽象方法的实现。这是Java中实现接口的基本规则。然而,除此之外,该类还可以定义自己的新方法。这些方法并不需要在接口中声明,也不需要在接口的所有实现类中都有。它们是这个类特有的功能。
以下是一个简单的例子:
// 定义一个接口
public interface MyInterface {void interfaceMethod(); // 接口中的抽象方法
}// 创建一个类实现该接口
public class MyClass implements MyInterface {// 实现接口中的抽象方法@Overridepublic void interfaceMethod() {System.out.println("Implementing interface method");}// 在类中定义自己的新方法public void myNewMethod() {System.out.println("This is a new method in MyClass");}public static void main(String[] args) {MyClass obj = new MyClass();// 调用接口方法obj.interfaceMethod();// 调用类的新方法obj.myNewMethod();}
}
相关文章:
Java学习笔记004——接口概念理解及意义
一个类中有抽象方法,则必须声明为abstract(做为抽象类),抽象类不能实例化。子类继承抽象类,必须对所有的抽象方法重写,否则依然有抽象方法,还是抽象的,无法实例化。故抽象类常做为基…...
MT笔试题
前言 某团硬件工程师的笔试题,个人感觉题目的价值还是很高的,分为选择题和编程题,选择题考的是嵌入式基础知识,编程题是两道算法题,一道为简单难度,一道为中等难度 目录 前言选择题编程题 选择题 C语言中变…...
50道SQL面试题
50道SQL面试题 有需要互关的小伙伴,关注一下,有关必回关,争取今年认证早日拿到博客专家 环境 -- ---------------------------- -- Table structure for teacher -- ---------------------------- DROP TABLE IF EXISTS teacher; CREATE TABLE teacher (t_id varchar(20) …...
2024蓝桥杯每日一题(双指针)
一、第一题:牛的学术圈 解题思路:双指针贪心 仔细思考可以知道,写一篇综述最多在原来的H指数的基础上1,所以基本方法可以是先求出原始的H指数,然后分类讨论怎么样提升H指数。 【Python程序代码】 n,l map(int,…...
Android 开发过程中常见的内存泄漏场景分析
场景1 Static变量存储上下文环境Context public class ClassName {// 定义1个静态变量private static Context mContext;//... // 引用的是Activity的contextmContext context; // 当Activity需销毁时,由于mContext 静态 & 生命周期 应用程序的生命周期&…...
Codeforces-1935E:Distance Learning Courses in MAC(思维)
E. Distance Learning Courses in MAC time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output The New Year has arrived in the Master’s Assistance Center, which means it’s time to introduce a new feature…...
ZooKeeper和Diamond有什么不同
本文主要是讨论下两个类似产品:ZooKeeper和Diamond在配置管理这个应用场景上的异同点。 Diamond,顾名思义,寄寓了开发人员对产品稳定性的厚望,希望它像钻石一样,提供稳定的配置访问。Diamond是淘宝网Java中间件团队的核…...
三、N元语法(N-gram)
为了弥补 One-Hot 独热编码的维度灾难和语义鸿沟以及 BOW 词袋模型丢失词序信息和稀疏性这些缺陷,将词表示成一个低维的实数向量,且相似的词的向量表示是相近的,可以用向量之间的距离来衡量相似度。 N-gram 统计语言模型是用来计算句子概率的…...
QML 3D入门知识路线
目前使用的版本 v5.14.0 模块导入 使用QML 3D时需要 import Qt3D.Core 2.14 核心模块类 V6以上的版本已经发布,所以有很多module会发生变化,主要有核心module、输入、逻辑、渲染、动画和扩展module,以及2D/3D场景模块 类名 能…...
蓝牙系列五:开源蓝牙协议BTStack框架代码阅读(1)
蓝牙学习系列,借鉴卫东上老师的蓝牙视频教程。 BTStack协议栈学习。首先来看一下,对于硬件操作,它是如何来进行处理的。在上篇文章中曾说过,在main函数里面它会调用硬件相关的代码,调用操作系统相关的代码。在BTStack中,可以搜索一下main.c,将会发现有很多main.c,都是…...
c++ 类内可以定义引用数据成员吗?
在C中,类内是可以定义引用数据成员的,但是在初始化对象时,必须在构造函数的成员初始化列表中对引用进行初始化,因为引用必须在创建时被初始化,并且不能在其生存期内引用不同的对象。下面是一个简单的示例: …...
MacBook2024苹果免费mac电脑清理垃圾软件CleanMyMac X
CleanMyMac X是一款专业的Mac清理软件,具备多种强大功能。首先,它能够智能清理Mac磁盘上的垃圾文件和多余语言安装包,从而快速释放电脑内存。其次,CleanMyMac X可以轻松管理和升级Mac上的应用,同时强力卸载恶意软件并修…...
Vue.js计算属性:实现数据驱动的利器
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…...
10-ARM gicv3/gicv4的总结-基础篇
目录 1、gic的版本2、GICv3/gicv4的模型图3、gic中断号的划分4、GIC连接方式5、gic的状态6、gic框架7、gic Configuring推荐 本文转自 周贺贺,baron,代码改变世界ctw,Arm精选, armv8/armv9,trustzone/tee,s…...
数据库系统概论(超详解!!!) 第三节 关系数据库
1.基本概念 1. 域(Domain) 域是一组具有相同数据类型的值的集合。 2. 笛卡尔积(Cartesian Product) 给定一组域D1,D2,…,Dn,允许其中某些域是相同的。 D1,D2…...
Springboot 集成kafka 消费者实现ssl方式连接监听消息实现消费
证书准备:springboot集成kafka 消费者实现 如何配置是ssl方式连接的时候需要进行证书的转换。原始的证书是pem, 或者csr方式 和key方式的时候需要转换,因为kafka里面是jks 需要通过openssl进行转换。 证书处理: KeyStore 用于存储客户端的证…...
spark 实验二 RDD编程初级实践
目录 一. pyspark交互式编程示例(学生选课成绩统计) 该系总共有多少学生; 该系DataBase课程共有多少人选修; 各门课程的平均分是多少; 使用累加器计算共有多少人选了DataBase这门课。 二.编写独立应用程序实现数…...
【MySQL】not in遇上null的坑
今天遇到一个问题: 1、当 in 内的字段包含 null 的时候,正常过滤; 2、当 not in 内的字段包含 null 的时候,不能正常过滤,即使满足条件,最终结果也为 空。 测试如下: select * from emp e;当…...
鸿蒙4.0-DevEco Studio界面工程
DevEco Studio界面工程 DevEco Studio 下载与第一个工程新建的第一个工程界面回到Project工程结构来看 DevEco Studio 下载与第一个工程 DevEco Studio 下载地址:点击跳转 https://developer.harmonyos.com/cn/develop/deveco-studio#download 学习课堂以及文档地址…...
前端将html导出pdf文件解决分页问题
这是借鉴了qq_251025116大佬的解决方案并优化升级完成的,原文链接 1.安装依赖 npm install jspdf html2canvas2.使用方法 import htmlToPdffrom ./index.jsconst suc () > {message.success(success);};//记得在需要打印的div上面添加 idlet dom document.que…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
