从零学Java - 接口

Java 接口

文章目录

  • Java 接口
    • 1.接口的语法
      • 1.1 与抽象类的区别
    • 2.如何使用接口?
      • 2.1 接口的使用规范
    • 3.什么是接口?
      • 3.1 常见关系
    • 4.接口的多态性
    • 5.面向接口编程
      • 5.1 接口回调
    • 6.特殊接口
      • 6.1 常量接口
      • 6.2 标记接口
    • 7.接口的好处
  • 补充
    • 面向对象 七大设计原则

1.接口的语法

接口:相当于特殊的抽象类,定义方式、组成部分与抽象类类似。

eg:

特点:
使用interface关键字定义接口
没有构造方法,不能创建对象
只能定义:公开静态常量、公开抽象方法
// JDK 1.8 之前
public interface Myinterface {public static final int COUNt = 100;public abstract void method();
}
/*	可以省略 'public', 'static', 'final', 'abstract' 关键字Modifier 'public' is redundant for interface membersModifier 'static' is redundant for interface fieldsModifier 'final' is redundant for interface fieldsModifier 'abstract' is redundant for interface methods
*///JDK 1.8 之后
JDK 1.8 版本接口中可以包含公开静态方法和公开默认方法- 公开静态方法:不能被继承,通过接口名.方法名调用static void method() {...}- 公开默认方法:可以被继承,也可以被重写,通过实现类调用default void method() {...}  //default 不是访问权限修饰符, 仅表示 "默认"

1.1 与抽象类的区别

相同

  • 可编译成字节码文件。
  • 不能创建对象。
  • 都可以声明变量(引用)。
  • 隐式具备Object类中所定义的方法。

不同

  • 接口所有属性都是公开静态常量,隐式使用public static final修饰。
  • 接口所有方法都是公开抽象方法,隐式使用public abstract修饰。
  • 接口没有构造方法、动态代码块、静态代码块。
  • 抽象类没有限制。

2.如何使用接口?

同抽象类相似, 都需要一个类去实现它; 使用 implement 关键字实现;

eg:

如何使用接口

接口:

public interface MyInterface {int COUNt = 100;void method();
}

实现类:

public class Student  implements MyInterface{@Overridepublic void method() {System.out.println("实现接口中的方法");}
}

测试类:

public class Test {public static void main(String[] args) {//使用声明引用Student student = new Student();//调用方法student.method();//调用常量System.out.println(Student.COUNt);}
}

2.1 接口的使用规范

  • 任何类在实现接口时,必须实现接口中所有的抽象方法,否则此类为抽象类。

  • 实现接口中的抽象方法时,访问修饰符必须是public。

  • 同父类一样,接口可声明为引用,并指向实现类对象。

    • 仅可调用接口中所声明的方法,不可调用实现类中独有的方法。

    • 可强转回实现类本身类型,进行独有方法调用。

3.什么是接口?

宏观概念:接口是一种标准。

微观概念:接口是一种能力和约定。

  • 接口的定义:代表了某种能力。
  • 方法的定义:能力的具体要求。

经验:Java为单继承,当父类的方法种类无法满足子类需求时,可实现接口扩充子类能力。

接口支持多实现,可为类扩充多种能力。

3.1 常见关系

  • 类与类: extends
    • 单继承
    • extends 父类名称
  • 类与接口: implement
    • 多实现
    • implements 接口名称1 , 接口名称2 , 接口名称n
    • 继承和实现同时存在时,继承在前,实现在后
  • 接口与接口:
    • 多继承
    • extends 父接口1 , 父接口2 , 父接口n

4.接口的多态性

内存图:在这里插入图片描述

特点:(微观概念) 接口是一种能力和约定。

不同引用类型,仅可调用自身类型中所声明的方法。

eg:

编写代码, 体现接口是一种能力和约定,以及接口的多态性

Animal:

public abstract class Animal {String breed;int age;String gender;public abstract void eat();public abstract void sleep();public abstract void show();
}

Runnable:

public interface Runnable {void run();
}

Swimmable:

public interface Swimmable {void swim();
}

Dog:

public class Dog extends Animal implements Runnable, Swimmable{String color;@Overridepublic void eat() {System.out.println("狗狗啃骨头...");}@Overridepublic void sleep() {System.out.println("狗狗睡觉...");}@Overridepublic void show() {System.out.println("狗狗信息...");}@Overridepublic void run() {System.out.println("狗狗奔跑...");}@Overridepublic void swim() {System.out.println("狗狗游泳...");}public void shout() {System.out.println("狗狗开始狗叫...");}
}

Test:

public class Test {public static void main(String[] args) {//创建狗狗对象//把狗狗当作狗看Dog dog = new Dog();dog.eat();dog.sleep();dog.show();dog.run();dog.swim();dog.shout();//多态: 把狗狗当作Animal看Animal animal = dog;animal.eat();animal.sleep();animal.show();//多态: 把狗狗当作能跑的对象看Runnable runnable = dog;runnable.run();//多态: 把狗狗当作能游泳的对象看Swimmable swimmable = dog;swimmable.swim();}
}

5.面向接口编程

特点:(宏观概念) 接口是一种标准。

面向接口编程,而非面向实现类 (依赖倒置原则)

eg:

用代码实现: 电脑具有USB接口, 连接带USB接口的设备

Usb:

public interface Usb {void service();
}

Fan:

public class Fan implements Usb{@Overridepublic void service() {System.out.println("风扇开始工作, 降温....");}
}

Mouse:

public class Mouse implements Usb{@Overridepublic void service() {System.out.println("鼠标开始工作, 移动...");}
}

Computer:

public class Computer {public Usb usb1, usb2;public void work() {System.out.println("电脑开始工作...");if (usb1 != null) {//实现者 交给 接口的使用者 调用usb1.service();}if (usb2 != null) {usb2.service();}}
}

Test:

public class Test {public static void main(String[] args) {Computer Leven = new Computer();Mouse mouse = new Mouse();Fan fan = new Fan();//连接电脑Leven.usb1 = mouse;Leven.usb2 = fan;Leven.work();}
}

5.1 接口回调

使编程符合现实逻辑

接口回调:先有接口的使用者,后有接口的实现者; 实现者交给接口的使用者调用

先有电脑, 再有鼠标, 鼠标需要交给电脑来使用

没有电脑, 光有鼠标, 逻辑上没法使用鼠标的功能

6.特殊接口

6.1 常量接口

常量接口: 将多个常用于表示状态或固定值的变量,以静态常量的形式定义在接口中统一管理,提高代码可读性。

eg:

public interface Week {//静态常量String MONDAY = "星期一";String TUESDAY = "星期二";String WEDNESDAY = "星期三";String THURSDAY = "星期四";String FRIDAY = "星期五";String SATURDAY = "星期六";String SUNDAY = "星期日";
}

6.2 标记接口

标记接口: 接口没有任何成员,仅仅是一个标记。SerializableCloneable

7.接口的好处

  • 降低程序的耦合性,更自然的使用多态。
  • 设计与实现完全分离,更容易搭建程序框架,更换具体实现。

补充

面向对象 七大设计原则

总则:开闭原则(Open Close Principle,OCP)

  • 开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,而是要扩展原有代码,实现一个热插拔的效果。

单一职责原则(Single Responsibility Principle,SRP)

  • 不要存在多于一个导致类变更的原因,也就是说每个类应该实现单一的职责,如若不然,就应该把类拆分。

里氏替换原则(Liskov Substitution Principle,LSP)

  • 里氏替换原则中说,任何基类可以出现的地方,子类一定可以出现。
  • 里氏替换原则中,子类对父类的方法尽量不要重写和重载。因为父类代表了定义好的结构,通过这个规范的接口与外界交互,子类不应该随便破坏它。

依赖倒置原则(Dependence Inversion Principle,DIP)

  • 面向接口编程,依赖于抽象而不依赖于具体。写代码时用到具体类时,不与具体类交互,而与具体类的上层接口交互。

接口隔离原则(Interface Segregation Principle,ISP)

  • 每个接口中不存在子类用不到却必须实现的方法,如果不然,就要将接口拆分。使用多个隔离的接口,比使用单个接口(多个接口方法集合到一个的接口)要好。

迪米特法则(最少知道原则)(Demeter Principle,DP)

  • 一个类对自己依赖的类知道的越少越好。也就是说无论被依赖的类多么复杂,都应该将逻辑封装在方法的内部,通过public方法提供给外部。这样当被依赖的类变化时,才能最小的影响该类。
  • 只和朋友通信,不和陌生人说话。

合成/聚合复用原则(Composite Reuse Principle,CRP)

  • 原则是尽量首先使用合成/聚合的方式,而不是使用继承。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/232236.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字IC后端实现之Innovus TA-152错误解析(分频generated clock定义错误)

**ERROR: (TA-152): A latency path from the ‘Fall’ edge of the master clock at source pin… Error Code TA-152 在数字IC后端实现innovus中我们经常会看到这类Error,具体信息如下所示。 Error Message **ERROR: (TA-152): A latency path from the ‘Fa…

Linux的基本指令(5)

目录 bc指令 uname指令 压缩解压相关的指令 zip指令 unzip指令 tar打包压缩指令 tar解压解包指令 ​编辑​编辑sz&rz 热键 关机命令 安装:yum install -y 指令 bc指令 bc命令可以很方便的进行浮点运算 Linux中的计算器 uname指令 语法:un…

Python新年烟花代码

Pygame 绘制烟花的基本原理 1,发射阶段:在这一阶段烟花的形状是线性向上,通过设定一组大小不同、颜色不同的点来模拟“向上发射” 的运动运动,运动过程中 5个点被赋予不同大小的加速度,随着时间推移,后面的…

YOLOv5改进 | Neck篇 | 利用Damo-YOLO的RepGFPN改进特征融合层

一、本文介绍 本文给大家带来的改进机制是Damo-YOLO的RepGFPN(重参数化泛化特征金字塔网络),利用其优化YOLOv5的Neck部分,可以在不影响计算量的同时大幅度涨点(亲测在小目标和大目标检测的数据集上效果均表现良好涨点幅度超级高!)。RepGFPN不同于以往提出的改进模块,其…

计算机毕业设计选题分享-SSM律师事务所业务管理系统01664(赠送源码数据库)JAVA、PHP,node.js,C++、python,大屏数据可视化等

SSM律师事务所业务管理系统 摘 要 随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,律师事务所业务管理系统当然也不能排除在外。律师事务所业务管理系统是以实际运用为开发背景…

WIN10-22H2专业版万人装机系统镜像

站长亲自封装的电脑维修人员专用装机系统镜像,系统干净无广告,稳定长效不卡顿,适合电脑维修店用来维修电脑重装系统。此版本是WIN10系统里非常稳定的正式版本之一,适合在维修电脑时重装系统或者大批量装机使用。本次封装镜像使用全…

【漏洞复现】冰峰VPN存在敏感信息泄露漏洞

漏洞描述 冰峰VPN log/system.log模块日志信息泄露漏洞 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益,未经授权请勿利…

每日一题——LeetCode1089.复写0

方法一 splice: 通过数组的slice方法,碰到 0就在后面加一个0,最后截取原数组的长度,舍弃后面部分。 但这样做是违反了题目的要求,不要在超过该数组长度的位置写入元素。 var duplicateZeros function(arr) {var le…

脑电范式学习(一):Psychopy安装

脑电范式学习(一):Psychopy安装 1 引言2 Psychopy软件3 安装教程4 花活儿5 总结 1 引言 可能有人会疑惑:为什么要去学Psychopy?Psychopy有什么好的? 首先,要告诉大家这么一个情况:现…

机器学习(四) -- 模型评估(3)

系列文章目录 机器学习(一) -- 概述 机器学习(二) -- 数据预处理(1-3) 机器学习(三) -- 特征工程(1-2) 机器学习(四) -- 模型评估…

zookeeper经典应用场景之分布式锁

1. 什么是分布式锁 在单体的应用开发场景中涉及并发同步的时候,大家往往采用Synchronized(同步)或者其他同一个JVM内Lock机制来解决多线程间的同步问题。在分布式集群工作的开发场景中,就需要一种更加高级的锁机制来处理跨机器的进…

unity PDFRender Curved UI3.3

【PDF】PDFRender 链接:https://pan.baidu.com/s/1wSlmfiWTAHZKqEESxuMH6Q 提取码:csdn 【曲面ui】 Curved UI3.3 链接:https://pan.baidu.com/s/1uNZySJTW0-pPwi2FTE6fgA 提取码:csdn

SQL Server 权限管理

CSDN 成就一亿技术人! 2024年 第一篇 难度指数:* * CSDN 成就一亿技术人! 目录 1. 权限管理 什么是权限管理? SQL server的安全机制 服务器级角色 数据库级角色 对象级角色 2. 创建用户 赋予权限 最重要的一步骤 1. 权限…

MediaPipeUnityPlugin Win10环境搭建(22年3月的记录,新版本已完全不同,这里只做记录)

https://github.com/homuler/MediaPipeUnityPlugin You cannot build libraries for Android with the following steps. 1、安装msys2配置系统环境变量Path添加 C:\msys64\usr\bin 执行 pacman -Su 执行 pacman -S git patch unzip 2、安装Python3.9.10 勾选系统环境变量 …

安全加固之weblogic屏蔽T3协议

一、前言 开放weblogic控制台的7001端口,默认会开启T3协议服务,T3协议则会触发的Weblogic Server WLS Core Components中存在反序列化漏洞,攻击者可以发送构造的恶意T3协议数据,获取目标服务器权限。 本文介绍通过控制T3协议的访问…

卷积神经网络|制作自己的Dataset(最终版)

​之前文章已经实现了一个自定义的类,制定了自己的数据集。其实,细看代码,可传入的参数过多,有些简单问题复杂化,实现上不是那么简洁。 既然是自己定义的数据集,那么许多功能是自己写好的,如何…

MySQL之视图内连接、外连接、子查询

一、视图 1.1 含义 虚拟表,和普通表一样使用 视图(view)是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,数据库中只存放了视图的定义,而并没有存放…

CSS animation动画和关键帧实现轮播图效果HTML

CSS animation动画和关键帧实现轮播图效果HTML 这轮播图效果使用h5和css3实现效果&#xff0c;不需要js控制&#xff0c;但是其中的缺点就是不能使用鼠标进行切换效果。 具有代码如下 <!DOCTYPE html> <html lang"en"><head><meta charset&quo…

Java并发集合详解

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;在这篇博客中&#xff0c;咱们将一起深入探索Java中的并发集合。多线程编程是一个不可或缺的部分&#xff0c;它能让程序运行得更快&#xff0c;处理更多的任务。但同时&#xff0c;多线程也带来了一些挑战&…

跟cherno手搓游戏引擎【1】:配置与入口点

环境配置&#xff1a; 编译环境&#xff1a;VS2019 创建两个项目&#xff1a; 设置Sandbox为启动项&#xff1a; 设置sandbox的配置属性-常规-输出目录\中间目录为如下&#xff1a; 预处理定义&#xff1a;为了配置一些只有windows才能用的函数。 设置YOTOEngin&#xff08;我…