Java中的接口

2023-11-11

1、生活中的接口

(1)Java中接口的作用和生活中的接口类似,它提供一种约定,使得实现接口的类(或结构)在形式上保持一致。

(2)如果抽象类中所有的方法都是抽象方法,就可以使用接口来表示。

(3)接口可以看作是一种特殊的“抽象类”,但是采用与抽象类完全不同的语法来表示,两者的设计理念也不同。


2、 定义和实现一个简单的接口

(1)接口是一个不能实例化的类型。接口类型的定义类似于类的定义,语法格式如下:

                public interface 接口名{

                        //接口成员

                }

        需要注意的是: 

        1)定义接口使用interface修饰符,访问修饰符只能是public,且可选。

        2)接口成员可以全是常量和公共的抽象方法。

        3)使用接口必须通过子类,子类通过implements关键字实现接口。

(2)实现接口的语法格式如下:

                public 类名 implements 接口名 {

                        实现方法

                        普通方法

                }

        需要注意的是:

        1)实现接口使用implements关键字。

        2)实现接口的类必须实现接口中定义的所有抽象方法。接口的实现类允许包含普通方法。


3、更复杂的接口

(1)接口本身也可以继承接口。

(2)接口继承的语法格式如下:

        [修饰符] interface 接口名 extends 父接口1,父接口2,......{

                常量定义

                方法定义

        }

(3)一个普通类只能继承一个父类,但能同时实现多个接口,也可以同时继承抽象类和实现接口。

(4)实现多个接口的语法格式如下:

        class 类名 extends 父类名 implements 接口1,接口2,......{

                类的成员

        }

(5)关于定义和实现接口,需要注意以下几个方面的内容。

        1)接口和类、抽象类是一个层次的概念,命名规则相同。

        2)修饰符如果是public,则该接口在整个项目中可见。如果省略修饰符,该接口只在当前包中可见。

        3)接口中可以定义常量,不能定义变量。接口中的属性都默认用“public static final”修饰,即接口中的属性都是全局静态常量。接口中的常量必须在定义时指定初始值。

        4)接口中的所有方法都是抽象方法,接口中的方法都默认为public。

        5)和抽象类一样,接口同样不能实例化,接口中不能有构造方法。

        6)接口之间可以通过extends实现继承关系,一个接口可以继承多个接口,但接口不能继承类。

        7)类只能继承一个父类,但可以通过implements实现多个接口。一个类必须实现接口的全部方法,否则必须定义为抽象类。若一个类在继承父类的同时又实现了多个接口,extends必须位于implements之前。

4、使用接口的优势

(1)接口可以解决Java中单根继承的局限性。

(2)在抽象类中可以将接口作为属性,通过属性调用该接口的方法。

5、面向对象设计的原则

(1)摘取代码中变化的行为,形成接口。

(2)多用组合,少用继承。

(3)针对接口编程,不依赖于具体实现。

        如果对一个类型有依赖,应该尽量依赖接口,尽量少依赖子类。因为子类一旦变化,代码变动的可能性大,而接口要稳定得多。

        在具体的代码实现中,体现在方法参数尽量使用接口,方法的返回值尽量使用接口,属性类型尽量使用接口等。

(4)针对扩展开放,针对改变关闭。

        如果项目中的需求发生了变化,应该添加一个新的接口或者类,而不要去修改原有的代码。

接口的代码实现:

//定义抽象类Door
public abstract class Door {
	
	//定义抽象方法开门的方法
	public abstract void openDoor();
	
	//定义抽象方法关门的方法
	public abstract void closeDoor();

}
public interface Lock {
	//接口中的方法访问修饰符默认为public abstract
	//接口中的方法都是抽象方法
	//接口不能实例化(不能创建对象)
	//一个类实现了某个接口,必须将接口中所有的方法重写,如果不重写,那么这个类也要定义为抽象类
	//接口中的变量都是静态常量。默认修饰符public static sinal
	
	//定义开锁的方法
	public abstract void openLock();
	
	//定义上锁的方法
	void closeLock();

}
//定义接口TakePhoto
public interface TakePhoto {
	void takeImg();

}
//定义FangDaoDoor继承抽象类Door,实现接口TakePhoto,Lock
public class FangDaoDoor extends Door implements Lock,TakePhoto{
	//重写抽象类中开门的方法
	@Override
	public void openDoor() {
		System.out.println("轻轻一推,门开了....");
		
	}
	//重写抽象类中关门的方法
	@Override
	public void closeDoor() {
		System.out.println("轻轻一拉,门关了....");
		
		
	}
	//重写接口TakePhoto中的takeImg方法
	@Override
	public void takeImg() {
		System.out.println("咔嚓,请注意你的行为,已经拍照上传....");
		
	}
	//重写接口Lock中的openLock方法
	@Override
	public void openLock() {
		System.out.println("左转3圈,锁开了.....");
		
	}
	//重写接口Lock中的closeLock方法
	@Override
	public void closeLock() {
		System.out.println("右转3圈,锁关了....");
		
	}
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java中的接口 的相关文章

  • 将处理项目移至 Eclipse

    我已经在处理项目上工作了一段时间 现在想将其移至 Eclipse 中 我已经在 Eclipse 环境中安装了 Proclipse 我有很多扩展名为 pde 的文件 然而 Proclipse 文件都以 java 结尾 所有 pde 文件都存在
  • Hashset - 创建 Set 后使对象相同

    如果我们在 HashSet 中添加两个不同的对象 可变的 然后通过调用 setter 更改对象的值 使它们相同 则大小仍然是 hashSet 的 2 我无法理解其原因 public static void main String args
  • Java 小程序在 Mac 上闪烁

    这个问题很奇怪 问题并非在每个平台上都会发生 我在使用 MacOSX 的 Google Chrome 中出现了这种情况 但在 Safari 中却没有出现这种情况 对于使用 Windows 的朋友来说 在 Google Chrome 上运行得
  • H2数据库:如何进行加密保护,而不暴露文件加密密钥

    我们在服务器模式下使用Java H2数据库 因为我们不希望用户访问数据库文件 为了对数据库文件添加更多保护 我们计划使用 AES 加密 将 CIPHER AES 添加到数据库 URL 以防存储被盗 但是 每个用户在连接时还需要提供文件保护密
  • Java Junit 测试 HTTP POST 请求

    我需要测试以下方法而不改变方法本身 该方法向服务器发出 POST 方法 但我需要制作一个独立于服务器的测试用例 在将其重定向到本地文件之前 我测试了类似的方法 但为此我将协议指定为文件 主机名指定为 localhost 端口指定为 1 我的
  • 如何避免Eclipse在将类名放在注释中时导入类,以便checkstyle稍后不会抱怨?

    有时我将类名放在方法或类的注释中只是为了引用 但是 Eclipse 会自动执行导入并在文件中留下导入语句 这会导致稍后出现 未使用的导入 检查样式错误 当我在注释中输入类名时 是否可以更改一些配置以避免 Eclipse 自动导入 人们不同意
  • 如何自动转换十六进制代码以将其用作 Java 中的 byte[]?

    我这里有很多十六进制代码 我想将它们放入 Java 中 而不需要向每个实体附加 0x 喜欢 0102FFAB 和我必须执行以下操作 byte test 0x01 0x02 0xFF 0xAB 我有很多很长的十六进制代码 有什么办法可以自动做
  • for循环中更新JLabel的问题

    我的程序的想法是从之前在其他 JFrame 中保存的列表中选择一个名称 我想在标签中一个接一个地打印所有名称 它们之间有很小的延迟 然后停在其中一个名称上 问题是lbl setText String 如果有多个则不起作用setText co
  • java中如何重新初始化int数组

    class PassingRefByVal static void Change int pArray pArray 0 888 This change affects the original element pArray new int
  • jDBI中如何进行内查询?

    我怎样才能在 jDBI 中执行这样的事情 SqlQuery select id from foo where name in
  • 如何使用 Java 在 selenium webdriver 中打开新选项卡或如何使用使用 selenium webdriver 的操作类在 selenium 中按 ctrl +T [重复]

    这个问题在这里已经有答案了 如何使用 Java 在 Selenium Webdriver 中按 CTRL T 或者 如何使用 Java 在 selenium webdriver 中打开新选项卡 简单步骤 1 打开google com 不必触
  • 了解Kafka流groupBy和window

    我无法理解 kafka 流中的 groupBy groupById 和窗口的概念 我的目标是聚合一段时间内 例如 5 秒 的流数据 我的流数据看起来像 value 0 time 1533875665509 value 10 time 153
  • 从字节数组设置 img src

    我需要设置img src我在对象中拥有的字节数组的属性 img
  • 无法连接到docker中的elasticsearch容器

    我正在尝试使用 docker 的官方 elasticsearch 镜像 我遵循了本指南 https www elastic co guide en elasticsearch reference current docker html但是当
  • 开发者环境-如何调用/消费其他微服务

    背景 我的环境 Java Play2 MySql 我在 Play2 gt S1 S2 S3 上编写了 3 个无状态 Restful 微服务 S1 消耗来自 S2 和 S3 的数据 因此 当用户点击 S1 时 该服务会异步调用 S2 S3 合
  • java.lang.UnsatisfiedLinkError - android studio gradle 中的 NDK?

    文件夹结构 app main java jni Android mk Application mk hello jni c res 在构建 gradle apply plugin com android application androi
  • 为什么不能在 if 语句中声明变量?

    以下 Java 代码无法编译 int a 0 if a 1 int b 0 if a 1 b 1 为什么 不能有任何代码路径导致程序将 1 分配给b无需先声明 我突然想到b的变量范围可能仅限于第一个if声明 但后来我不明白为什么 如果我实在
  • 在java中执行匿名pl/sql块并获取结果集

    我想执行匿名 PL SQL 并需要获取结果集对象 我得到了可以通过在 PL SQL 块内使用游标来完成的代码 但 PL SQL 块本身将以文本形式来自数据库 所以我无法编辑该 PL SQL 块 并且它只会返回两个值 其列名始终相同 它将返回
  • Dart/Flutter 如何编译到 Android?

    我找不到任何具体的资源 Dart 是否被编译到 JVM 或者 Google 的团队是否编译了 Dart VM 以在 JVM 上运行 然后在 JVM 内的 Dart VM 中运行 Dart 前者更有意义 并且符合 无桥 的口号 但后者似乎更符
  • Java时区混乱

    我正在运行 Tomcat 应用程序 并且需要显示一些时间值 不幸的是 时间快到了 还有一个小时的休息时间 我调查了一下 发现我的默认时区被设置为 sun util calendar ZoneInfo id GMT 08 00 offset

随机推荐

  • c++二分查找—来自编程珠玑

    c 二分查找 来自编程珠玑 二分查找法 Binary search algorithm 是一个很常见的算法 从 编程珠玑 里再次看到时又有新的收获 直接看代码吧 下面是常见的实现代码 int binary search int a int
  • linux vim使用

    读本文之前请注意 1 本文的目标是提供一些vim的使用技巧 利用这些技巧可以提高vim的操作效率 部分技巧在vi上也可以使用 但是现在基本上都是用vim了 2 本文是整理和总结使用技巧 而非讲解vim入门 因此不会涉及最基本的使用 例如如何
  • 笔试

    文章目录 前言 27 时钟抖动jitter 时钟偏移skew 28 EDA开发工具 29 时序约束 30 DMA 31 乒乓buffer 32 BRAM DRAM 33 设计描述方式 34 延迟设计 35 DDR带宽计算 总结 往期精彩 前
  • xml建模包括以下_建模干货,1分钟速学,Photoscan空三结果完美导入CC

    关注公众号 三维前沿 获取更多倾斜摄影 激光点云资讯 相信大家都经历过 有时CC空三总是失败或错误 最崩溃的是 一顿操作猛如虎 定睛一看原地杵 此时 Photoscan空三能力其实可优于CC 头疼的是 又不想放弃用CC来建模 所以今天 为你
  • JAVA题目~由Point类组合成Triangle类 Exp04-1

    问题描述 先定义Point类 再定义Triangle类 在Triangle类中定义三个Point对象来表示一个三角形的三个顶点 然后定义一个方法isTri 对这三个点是否能构成三角形进行判定 构造方法先调用isTri 如果三个点能够构成三角
  • VUE中 created(),mounted()与activated() 方法都是干嘛的?

    created html加载完成之前 执行 执行顺序 父组件 子组件 mounted html加载完成后执行 执行顺序 子组件 父组件 methods 事件方法执行 watch watch是去监听一个值的变化 然后执行相对应的函数 comp
  • Python爬虫-某网酒店评论数据

    前言 本文是该专栏的第6篇 后面会持续分享python爬虫案例干货 记得关注 本文以某网的酒店数据为例 采集对应酒店的评论数据 具体思路和方法跟着笔者直接往下看正文详细内容 附带完整代码 注意 本文的案例 数据集 选用的是本专栏上一篇 Py
  • 教程篇(7.2) 03. 第2层设计 & FortiSwitch ❀ Fortinet网络安全专家 NSE6

    在本课中 你将了解最常见的FortiSwitch拓扑 以及FortiSwitch上可用的不同环路预防协议和方法 在这节课中 你将学习上图显示的主题 通过展示FortiSwitch拓扑的能力 你应该能够确定最适合你的网络设计需求的拓扑 当涉及
  • chisel-book-chinese

    chisel book chinese 蓝奏云地址 https wwu lanzoue com isdim08x8x5i
  • 王爽老师汇编13.3对int iret和栈的深入理解 在屏幕中间显示80个叹号字符

    6666 问题 用7ch中断例程完成loop指令的功能 个人自学思考编写的 不知道和书中的要表达的意思是否相同 先编译运行第一个代码 再编译运行第二个显示代码 下面为写入内存0 200出的中断代码 iret指令为跳转指令 跳转到显示代码处
  • 音频wav mp3 批量转文本

    作为一个业余的软件开发爱好者 我又捣鼓了一个有意思的小东西 使用完全免费哈 使用了目前已有的音频识别的深度学习网络 然后封装成了一个单独的模块 使用的方法就是下载软件 然后打开音频所在的文件夹就行了 会自动扫描wav mp3 后缀结尾的文件
  • OSI七层模型与TCP/IP五层模型

    1 OSI open system interconnection 七层模型 OSI模型为开放式系统互联参考模型 是一个逻辑上的定义和规范 把网络从逻辑上划分为了7层 每一层都有相应的物理设备 OSI模型是一种框架性的设计方法 其主要功能是
  • .net grpc简单使用

    本文提供一个最简单的grpc demo 来模拟一个本地应用使用grpc的方式去调用一个远程的服务 文章目录 首先创建一个grpc项目来模拟远程服务 再创建一个项目来调用服务 如果需要在web api项目而不是控制台程序中调用远程服务 首先创
  • 【Github】GPT2-Chinese:中文的GPT2训练代码

    推荐一个Github项目 Morizeyao GPT2 Chinese Chinese version of GPT2 training code using BERT tokenizer 作者是AINLP交流群里的杜则尧同学 提供了一份中
  • 排阻的封装尺寸

    http arlen opcom blog 163 com blog static 33775037201011144225518 0402封装 0603封装 1 电阻封装尺寸与功率关系 通常来说 0201 1 20W 0402 1 16W
  • MATLAB与当今时代的意义

    对于现在的工科生来说 MATLAB 是必不可少的工具 其必要性可能仅次于 Office 了 如果你想在谷歌工作 确保你会用MATLAB 谷歌产品高级副总裁Jonathan Rosenberg认为 对于学生而言 掌握如何使用MATLAB将为其
  • 内存卡受损文件如何恢复

    现在的手机 你不用担心内存不够用 因为我们都有内存卡 一个8g内存的手机用内存卡扩到32g 64g都不成问题 而且存到内存卡上的资源还不耽误手机运行 简直一举两得 手机内存卡和很多卡片是一样的 u盘文件恢复工具 http mydown ye
  • Spring Boot 笔记

    springBoot 注解示意图 SpringBootApplication EnableAutoConfiguration 导入组件类 Import AutoConfigurationImportSelector class 调用方法 s
  • 数据存储——数据库

    关系型数据库存储 关系型数据库是基于关系模型的数据库 而关系模型是通过二维表保存的 所以它的存储方式就是行列组成的表 每一列就是一个字段 每一行就是一条记录 表可以看作某个实体的集合 而实体之间存在联系 这就需要表与表之间的关联关系来体现
  • Java中的接口

    1 生活中的接口 1 Java中接口的作用和生活中的接口类似 它提供一种约定 使得实现接口的类 或结构 在形式上保持一致 2 如果抽象类中所有的方法都是抽象方法 就可以使用接口来表示 3 接口可以看作是一种特殊的 抽象类 但是采用与抽象类完