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

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...

[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...