java基础 之 接口

news2024/11/14 13:43:15

文章目录

  • 前言
  • 接口
    • 浅浅理解下接口
    • 抽象类与接口的爱恨情仇
    • 特点
    • 接口的回调
  • 抽象类和接口
    • 相同之处
    • 区别

前言

前文回顾 戳这里→java基础 之 抽象类
因为接口是对抽象类的一种延伸,所以请先了解一下抽象类会更好的理解接口哦

子类对抽象类叫继承,使用关键字extends;
子类对接口叫实现,使用关键字implement;

jdk1.8以前,接口中的方法必须全部是抽象方法;jdk1.8之后可以使用default关键字来实现。
本文介绍是基于jdk1.8以前的

接口

浅浅理解下接口

  • 回顾抽象类

    1、是站在类的角度把共性抽离出来
    2、主要作用是用来当父类的
    3、目的是让代码共用的同时还能提升代码的灵活性
    4、有抽象方法和普通方法,但是不能实例化对象

  • 抽象类是不是就够用了呢?

    1、抽象类一种共性的抽离,那如果在抽象类中,只有抽象方法,那可以再抽离一下吗?
    2、有时候继承一个抽象类不足以满足当前对象的属性,怎么办?

    于是,我们引入了接口~~

抽象类与接口的爱恨情仇

  • 接口也是类

  • 接口就是抽象类抽象到了极致

    如果一个类是抽象类,且类中的所有方法都是抽象方法。那么类需要写abstract修饰,方法也写abstract修饰,为了减少代码量,我们可以把这个抽象类“抽象”成一个接口。

    也就是说,接口是抽象类的抽象类。
    接口用interface替代了类的abstract修饰和方法上的abstract修饰

  • 抽象类是个模板,接口就是个标准

    抽象类可以有自己的普通方法。接口中全部是抽象方法,没有方法体,可以理解为一个标准,具体实现需要子类去实现

  • 类只支持单继承,但是接口支持多实现

    java中类的继承只能是单继承:如果同时继承两个类,如果两个类有相同的非抽象方法(普通方法),子类就无法确定使用哪个父类的方法

    类对接口的实现,支持多实现:接口只是个标准,所有的方法都是没有方法体的。类去实现接口后,需要根据自己的业务逻辑去重写该方法。这样即使两个接口有相同的方法,重写后方法也是唯一的,没有冲突。

特点

  • 1、接口是一种特殊的类,使用的关键字是interface

  • 2、接口中所有的方法默认是public abstract修饰的(一般省略不写)

  • 3、接口中的所有成员变量都是有public static final修饰的

    接口可以认为是一个标准,标准就是公开(public)、共享(static)、不可变(final)的

  • 4、接口没有构造方法,可是使用多态

    构造方法是用来实例化对象的,接口不可以实例化对象

  • 5、实现接口的类必须要实现接口中所有方法。如果不想实现接口中的所有方法,那么该类设置成抽象类即可

  • 6、接口和接口之间可以继承,并且支持多继承;类与接口之间是实现关系,并且一个类可以多现实多个接口

  • 7、接口与实现类之间存在多态性

    我们定义一个接口Animal、Move 和 Eat
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    使用类的多态,如果是Animal的话,只能调用breath()和run()方法
    在这里插入图片描述

    使用类的多态:如果是Eat的话,只能调用eating()方法
    在这里插入图片描述

    使用类的多态:如果是Move的话,只能调用moving()方法
    在这里插入图片描述

接口的回调

  • 在接口没有实现前也可以调用

    即先有接口的使用者,再有接口的实现者

  • 实现一个接口回调

    1、创建一个usb接口,方法我们先只有一个service()
    2、定义接口的使用者Computer类,该类包含三个usb属性
    3、定义三个类 Key(键盘)、Mouse(鼠标)、Udisk(U盘)来实现Usb接口
    4、实例化Computer类

    /***
     * 创建一个usb接口,方法只有一个service
     */
    public interface Usb {
        void service();
    }
    
    /***
     * 定义接口的使用者Computer类
     */
    public class Computer {
        Usb usb1;
        Usb usb2;
        Usb usb3;
        
        public void run(){
            System.out.println("Computer 启动");
            if(usb1!=null){
                usb1.service();
            }
            if(usb2!=null){
                usb2.service();
            }
            if(usb3!=null){
                usb3.service();
            }
        }
    }
    
    /***
     * 定义Mouse类来实现Usb接口
     */
    public class Mouse implements Usb{
        @Override
        public void service() {
            System.out.println("鼠标启动");
        }
    }
    
    /***
     * 定义Key类来实现Usb接口
     */
    public class Key implements Usb{
        @Override
        public void service() {
            System.out.println("键盘启动");
        }
    }
    
    /***
     * 定义Udisk类来实现Usb接口
     */
    public class Udisk implements Usb{
        @Override
        public void service() {
            System.out.println("U盘启动");
        }
    }
    
    // 测试方法
    public class Test {
        public static void main(String[] args) {
            Computer computer = new Computer();
            computer.usb1 = new Key();
            computer.usb2 = new Mouse();
            computer.usb3 = new Udisk();
            computer.run();
        }
    }
    ----------------输出结果--------------------
    Computer 启动
    键盘启动
    鼠标启动
    U盘启动
    

抽象类和接口

相同之处

  • 接口和抽象类中都可以有静态代码块和静态方法、抽象方法和默认方法

    接口的默认方法是由default修饰,在jdk1.8以后使用

区别

  • 1、接口中的方法默认抽象方法,在接口中不能有实现;抽象类中的非抽象的方法可以有方法体
  • 2、接口中的成员变量默认是final修饰的;抽象类中的成员变量不一定
  • 3、一个类可以实现多个接口,但是最多只能继承一个抽象类
  • 4、一个类实现接口需要实现接口的所有方法,继承抽象类只需要实现抽象方法,非抽象方法不做要求
  • 5、从设计层面来看:抽象类是对类的抽象,是一种模板设计。而接口是行为的抽象,是一种行为的规范

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python 从入门到实战3(列表的简单操作)

我们的目标是:通过这一套资料学习下来,通过熟练掌握python基础,然后结合经典实例、实践相结合,使我们完全掌握python,并做到独立完成项目开发的能力。 上篇文章我们通过python小栗子来学习python基础知识语法&#xff…

怎样还原空白试卷?2024快速空白试卷还原软件合集

怎样还原空白试卷?2024快速空白试卷还原软件合集 在教育和考试过程中,有时需要将已经填写过的试卷还原为空白状态,以便重新使用或进行复印。通过使用特定的软件,你可以轻松地去除试卷上的手写内容或标记,恢复试卷的空…

【网络安全 | 虚拟机】VMware Workstation Pro下载安装使用教程(免费版)

未经许可,不得转载。 文章目录 下载安装使用(Centos)下载 进入官网页面,注册账户: https://profile.broadcom.com/web/registration注册后登录(用户名为邮箱),选择My Downloads: 如图选择: 如图选择: 如图选择: 如图选择:

嵌入式Linux C应用编程指南-进程、线程(速记版)

第九章 进程 9.1 进程与程序 9.1.1 main()函数由谁调用? C 语言程序总是从 main 函数开始执行,main()函数的原型是: int main(void) 或 int main(int argc, char *argv[])。 操作系统下的应用程序在运行 main()函数之前需要先执行一段引导代…

性能炸裂的数据可视化分析工具:DataEase!【送源码】

今天分享一款开源的数据可视化分析工具,帮助用户快速分析数据并洞察业务趋势,从而实现业务的改进与优化。支持丰富的数据源连接,能够通过拖拉拽方式快速制作图表,并可以方便地与他人分享。 技术栈 前端:Vue.js、Elemen…

【网络基础】探索 NAT 技术:IP 转换、NAPT、NAT穿越及代理服务器

文章目录 1. 前言2. IP 转换过程3. NAPT① 基本概念② 工作原理③ 优缺点④ 实际应用 4. 缺陷5. NAT 穿越① 概述② 示例 6. NAT 与 代理服务器① 代理服务器与NAT的区别:② 正向代理 / 反向代理 服务器 1. 前言 NAT(网络地址转换)是一种常见…

路由策略工具

1.产生背景 a.保证数据访问的安全性 b.提高链路带宽利用率 c.流量路径不优 2.解决方案: 解决方案一:路由策略:可通过修改路由条目(即对接收和发布的路由进行过滤)来控制流量可达性 解决方案二:流量过滤:可使用Traffic-Filter工具对数据直接进行过滤 3.路由策略工具 a.可利…

登录究竟有多少种花样?

写在最前面: 大家好,我是小....小白不黑,现在的app以及任何一个系统,都离不开登录。其中最常见的估计就是密码登录,二维码登录,第三方账号登录以及单点登录了。 现在,让我们来捋一捋&#xff…

【virtuoso】INV 原理图+前仿真 + 版图 + 后仿真

采用SMIC工艺,不同工艺版图窗口可能有差异 1. 原理图&前仿真 1.1 绘制原理图 PMOS: NMOS宽长比2:1 PMOS开启导通电阻大一点,这样设置,可以使得阈值电压是VDD/2 按 i,可以插入器件按p,可以放置端口 1.2…

AXIS接口教程

免责声明: 本文所提供的信息和内容仅供参考。作者对本文内容的准确性、完整性、及时性或适用性不作任何明示或暗示的保证。在任何情况下,作者不对因使用本文内容而导致的任何直接或间接损失承担责任,包括但不限于数据丢失、业务中断或其他经济…

Unity3D安卓游戏第三方SDK接入

PS:持续更新... 什么是SDK? SDK(Software Development Kit,软件开发工具包)是一个用于构建应用程序的工具集,包含开发特定软件的必要工具、库、文档和示例代码。SDK通常由软件或硬件厂商提供,帮…

MySQL高阶练习题1- 寻找面试候选人

目录 题目 准备数据 分析数据 实现代码 总结 题目 返回 所有面试候选人 的姓名 name 和邮件 mail 。当用户满足以下两个要求中的 任意一条 ,其成为 面试候选人 : 该用户在 连续三场及更多 比赛中赢得 任意 奖牌。该用户在 三场及更多不同的 比赛中赢得 金牌&…

Linux——用户和权限

root用户(超级管理员) root用户拥有最大的系统操作权限,而普通用户在许多地方的权限是受限的。 ****************** 使用普通用户在根目录下创建文件夹 切换到root用户后,继续尝试 普通用户的权限,一般在其HOME目录…

【linxu】虚拟环境中Python 版本错乱:深入探究 Linux 虚拟环境的识别问题

【linxu】虚拟环境中Python 版本错乱:深入探究 Linux 虚拟环境的识别问题 问题描述:在服务器上,我配置了一个虚拟环境,明确指定使用 Python 3.8 版本。然而,当我激活该环境并检查 Python 版本时,意外地发现…

IO练习--随机点名

随机点名器1 需求: 有一个文件里面存储了班级同学的信息,每一个信息占一行。 格式为:张三-男-23 要求通过程序实现随机点名器。 运行效果: 第一次运行程序:随机同学姓名1(只显示名字) 第二次运行程序:随机同学姓名2(只显示名字) 第三次运行程序:随机同学姓名3(只显…

数学建模强化宝典(2)linprog

一、介绍 linprog 是 MATLAB 中用于解决线性规划问题的函数。线性规划是一种优化方法,它尝试在满足一组线性等式或不等式约束的条件下,找到一个线性目标函数的最大值或最小值。linprog 函数适用于求解形如以下问题的线性规划问题: minimizecT…

Native开发与逆向第六篇 -字符串加密与hook

开发demo 写一个简单的字符串加密处理&#xff0c;将字符串字符转成ASCII十六进制值 std::string StrToHex(std::string str){unsigned char c;char buf[3];std::string result "";std::stringstream ss;ss << str;while (ss.read((char *)(&c), sizeof…

Python数据类型转换背后的逻辑

文末赠免费精品编程资料~~ 今天让我们深入浅出地探索Python数据类型转换的奥秘。Python&#xff0c;作为一门灵活的编程语言&#xff0c;其强大的数据类型转换能力是日常编码中不可或缺的一部分。今天&#xff0c;我们将一步步揭开类型转换背后的逻辑&#xff0c;让你从新手进…

【wsl2】从C盘迁移到G盘

参考大神 C盘的ubuntu22.04 非常大&#xff0c;高达30g 迁移后就只有几百M了&#xff1a; 右键有一个move没有敢尝试 迁移过程 Windows PowerShell Copyright (C) Microsoft Corporation. All rights reserved.Install the latest PowerShell for new features and improveme…

HCCL集合通信算法开发Hello World示例(超详细)

本文给读者介绍了HCCL算法开发所涉及的概念和流程&#xff0c;并通过一个样例将前文介绍的内容串联起来。本文定位为HCCL算法开发的入门介绍&#xff0c;读者读完后&#xff0c;可结合HCCL开放代码仓中的算法样例&#xff0c;做深入研究。 1 什么是集合通信 集合通信定义了一…