当前位置: 首页 > news >正文

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. 定义行为规范:接口定义了一组方法,这些方法由实现该接口的类来提供具体实现。这提供了一种机制,允许类遵循特定的行为规范或契约,而无需知道实现这些方法的具体细节。
  2. 实现多态:接口是实现多态性的关键工具之一。通过接口,我们可以创建一个接口类型的引用,该引用可以指向实现该接口的任何类的对象。这使得我们可以在不修改现有代码的情况下,将新的实现添加到系统中,从而增强了系统的可扩展性。
  3. 解耦:接口有助于降低类之间的耦合度。通过将功能划分为独立的接口,我们可以减少类之间的直接依赖关系,从而使代码更易于维护、测试和重用。
  4. 抽象:接口提供了一种抽象机制,允许我们只关注对象的行为,而不是其具体实现。这有助于我们创建更通用、更灵活的代码。
  5. 实现代码重用:多个类可以实现同一个接口,这意味着它们可以共享相同的方法签名。这有助于减少代码冗余,提高代码重用性。
  6. 支持回调:接口经常用于实现回调机制,即允许一个对象在某个事件发生时调用另一个对象的方法。这在事件驱动编程中非常常见,例如当用户点击按钮或触发其他事件时,程序会调用相应的回调函数。

总结:

(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…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能

1. 开发环境准备 ​​安装DevEco Studio 3.1​​: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK ​​项目配置​​: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...

Docker拉取MySQL后数据库连接失败的解决方案

在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...

vue3 daterange正则踩坑

<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...

DiscuzX3.5发帖json api

参考文章&#xff1a;PHP实现独立Discuz站外发帖(直连操作数据库)_discuz 发帖api-CSDN博客 简单改造了一下&#xff0c;适配我自己的需求 有一个站点存在多个采集站&#xff0c;我想通过主站拿标题&#xff0c;采集站拿内容 使用到的sql如下 CREATE TABLE pre_forum_post_…...

绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化

iOS 应用的发布流程一直是开发链路中最“苹果味”的环节&#xff1a;强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说&#xff0c;这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发&#xff08;例如 Flutter、React Na…...

2025.6.9总结(利与弊)

凡事都有两面性。在大厂上班也不例外。今天找开发定位问题&#xff0c;从一个接口人不断溯源到另一个 接口人。有时候&#xff0c;不知道是谁的责任填。将工作内容分的很细&#xff0c;每个人负责其中的一小块。我清楚的意识到&#xff0c;自己就是个可以随时替换的螺丝钉&…...