【Java基础篇 | 面向对象】—— 聊聊什么是接口(上篇)

个人主页:兜里有颗棉花糖
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创
收录于专栏【JavaSE_primary】
本专栏旨在分享学习JavaSE的一点学习心得,欢迎大家在评论区交流讨论💌
在这里插入图片描述

关于接口的简单的介绍请看这篇文章(接口的简单介绍),本文将继续接着上篇对接口进行更加详细的讲解。

目录

  • 一、接口的代码实现(简单接口回顾)
  • 二、接口特性
  • 三、实现多个接口
  • 四、接口间的继承(extends)

一、接口的代码实现(简单接口回顾)

这里由于代码过长所以只能以图片的方式进行呈现了,大家先凑活看哈,请看:
接口:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
运行结果如下:
在这里插入图片描述

二、接口特性

  • 接口是不能进行实例化的:接口类型是一种引用类型,所以不能new接口的对象。
  • 接口中的每个方法都是public abstract修饰的方法,接口中的方法都会被隐式的指定为public abstract,也只能是被public abstract修饰,使用其它的修饰符都会报错。
  • 接口中的方法不能在接口中实现,只能在实现接口中的类进行实现,如果非要在接口中进行实现的话,该方法必须由default进行修饰。
  • 子类实现接口中方法的时候,这个方法必须是由public进行修饰(因为接口中的抽象方法一定是由public abstract进行修饰的)。
  • 接口中可以含有变量,这个变量会被隐式的指定为public static final修饰。
  • 接口中不能含有静态代码块和构造方法。
  • 接口虽然不是类,但是接口编译完成后字节码文件的后缀格式就是.class
  • 如果类中没有实现接口中的所有抽象方法,则该类必须设置为抽象类(出来混迟早要还的)。
  • jdb8中,接口中还可以包含default方法。

三、实现多个接口

下面来看多接口的代码:

interface IFlying {
    void fly();
}
interface ISwimming {
    void swim();
}
interface IRunning {
    void run();
}
abstract class Animal {
    public int age;
    public String name;
    public abstract void eat();
}
class Dog extends Animal implements IRunning,ISwimming {
    @Override
    public void eat() {
        System.out.println(this.name + "正在吃狗粮");
    }

    @Override
    public void run() {
        System.out.println(this.name + "正在跑步");
    }
    @Override
    public void swim() {
        System.out.println(this.name + "正在狗刨式游泳");
    }
}

解释1:子类Dog必须先继承父类然后再实现接口中的方法。即class Dog extends Animal implements IRunning,ISwimming
java中之所以子类必须先继承父类然后再实现接口中的方法是因为java不支持多继承。

解释2:为什么不把三个接口中的方法写到抽象类Animal中?
在上述代码中,将飞行、游泳和奔跑这三个行为分别定义在了接口IFlying、ISwimming和IRunning中,而没有将它们写入抽象类Animal中的原因是因为接口和抽象类具有不同的设计目的和用途。
抽象类用于表示一类对象的通用特性和行为,并且可以包含具体的方法实现。抽象类可以作为其他类的基类,被继承和扩展。(请结合上述代码加以理解。)
接口则用于定义一组行为或功能的契约,它只能包含方法声明,而不能包含方法的实现。接口允许一个类实现多个接口,从而具备多个角色或行为。接口实现了多态性的概念,使得不同的类可以实现相同的接口,并根据自己的需求来实现具体的方法。
在给定的例子中,抽象类Animal表示了动物的通用特性,并且包含了方法的具体实现(例如eat方法)。而接口IFlying、ISwimming和IRunning表示了特定的行为,是动态的、可扩展的契约。通过在Dog类中实现这些接口,Dog类表明自己具有飞行、游泳和奔跑的能力。(并不是所有的动物都会飞或者游泳或者跑

如果把接口换成类也是不可以的,因为java中只支持单继承。所以Java中的接口提供了一种解决多继承问题的机制

好了,现在我们对上述代码进行拓展方便大家能够更好的进行理解,代码如下:

interface IFlying {
    void fly();
}
interface ISwimming {
    void swim();
}
interface IRunning {
    void run();
}
abstract class Animal {
    private int age;
    private String name;

    public abstract void eat();

    public Animal(String name,int age) {
        this.name = name;
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
class Dog extends Animal implements IRunning,ISwimming {
    public Dog(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println(this.getName() + "正在吃狗粮");
    }

    @Override
    public void run() {
        System.out.println(this.getName() + "正在跑步");
    }
    @Override
    public void swim() {
        System.out.println(this.getName() + "正在狗刨式游泳");
    }
}

class Bird extends Animal implements IFlying {

    public Bird(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println(this.getName() + "正在吃鸟粮!");
    }

    @Override
    public void fly() {
        System.out.println(this.getName() + "正在用翅膀飞!");
    }
}

class Robot implements IRunning {
    @Override
    public void run() {
        System.out.println("机器人正在跑!");
    }
} // Robot甚至不是动物,但是机器人会跑啊,所以我们依然可以结合IRunning()接口来进行使用。

public class Test {
    public static void test1(Animal animal) {
        animal.eat();
    }

    public static void test2(IFlying iFlying) {
        iFlying.fly();
    }

    public static void testRun(IRunning iRunning) {
        iRunning.run();
    }

    public static void testSwim(ISwimming iSwimming) {
        iSwimming.swim();
    }

    public static void main(String[] args) {
        test2(new Bird("小鸟3",3));
        testRun(new Dog("小狗2",2));
        testSwim((new Dog("小狗3",4)));
        testRun(new Robot());
    }
    public static void main1(String[] args) {
        test1(new Bird("小鸟1",3)); // 向上转型:父类引用引用了子类,子类中重写了父类中的抽象方法
        test1(new Dog("小狗1",3)); // 向上转型:父类引用引用了子类,子类中重写了父类中的抽象方法
    }
}

上述代码是java面向对象编程中最常见的一个用法:一个类继承父类,并且实现了多个接口。

继承表达的是一个is a的意思,即它是哪一类东西,而接口表达的具有某种特性。举个栗子:
青蛙是一种动物,它可以在水里游泳
老鹰也是一种动物,它可以在天空中遨游
狼是一种动物,它可以在草地上

java中的这种设计(一个类继承父类,并且实现了多个接口)提醒我们要忘记某一事物的类型,因为有了接口之后我们只需要关心该事物是否具有某种特性

四、接口间的继承(extends)

类和类之间是通过extends来来进行继承的。
类和接口之间的关系:通过implements来实现接口。
接口和接口之间也是存在关系的,是通过extends来进行关联的。即拓展接口功能。
如下图,请看:
在这里插入图片描述
上图接口C不仅仅有自己的功能也会同时由接口A和接口B的功能。
在这里插入图片描述
上图中的类D不仅仅要实现接口C的功能,而且还需要实现接口A和接口B的功能。(接口间的继承可以理解为把多个接口合并在一起

好了,以上就是Java中接口中最基本的内容了。就到这里吧,再见啦友友们!!!

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

干爆ChatGPT,谷歌发布新大模型:Gemini

我是卢松松,点点上面的头像,欢迎关注我哦! 谷歌昨天又发布了一个新的大模型,叫Gemini(双子座时代)。打开Google AI 就能看到。 据说非常强,然后是一大堆夸奖,大概是本月中旬的时候正式推出。标题明晃晃写…

《使用ThinkPHP6开发项目》 - 安装ThinkPHP框架

1.安装ThinkPHP6框架 这里我们使用的是composer安装的安装方式,请确保电脑已经安装了composer,如未安装可查看Composer 安装与使用 | 菜鸟教程 composer create-project topthink/think tp 上面命令安装的是稳定版的,也是最新的稳定版&…

【Java 基础】23 国际化

文章目录 1.概念2.原理1)Locale2)ResourceBundle3)MessageFormat 3.例子1)准备资源文件2)加载资源文件3)格式化消息(非必须) 总结 在全球化的今天,开发支持多语言的应用变…

LinuxBasicsForHackers笔记 -- BASH 脚本

你的第一个脚本:“你好,黑客崛起!” 首先,您需要告诉操作系统您要为脚本使用哪个解释器。 为此,请输入 shebang,它是井号和感叹号的组合,如下所示:#! 然后,在 shebang …

为什么越来越多的网站使用https,有什么好处?什么是https加密协议?

首先回答“什么是https加密协议?” HTTPS(HyperText Transfer Protocol Secure)是一种通过加密传输数据的安全版本的HTTP协议。它使用了SSL(Secure Sockets Layer)或TLS(Transport Layer Security&#xf…

IntelliJ IDEA 2023.3 最新变化

关键亮点 AI Assistant 预览阶段结束 全面推出 Ultimate JetBrains AI Assistant 现已全面推出,搭载大量新功能和改进,助力提高您在 JetBrains IDE 中的工作效率。 最新更新包括编辑器中增强的直接代码生成、无需复制代码即可回答项目相关查询的上下文…

网络监控:网络故障告警通知

网络警报是向网络管理员发出的指示,表明设备已达到其设置的阈值或面临任何性能异常,网络警报可以通过不同的渠道通知网络管理员,例如电子邮件、短信、松弛、网络警报等。 通过网络监控警报,可以快速了解网络问题,通过…

低代码与MES:智能制造的新篇章

一、引言 随着工业4.0和智能制造的兴起,企业对于生产过程的数字化、智能化需求日益迫切。制造执行系统(MES)作为连接计划层与控制层的关键信息系统,在提升生产效率、优化资源配置、保障产品质量等方面发挥着重要作用。然而&#…

前端开发常用的Vscode插件整理(持续更新)

本文记录用vscode进行前端开发时,常用到的有用的vscode插件,将不定时更新~ 1、Chinese (Simplified) 将编辑器变成简体中文 2、vscode-icon 让 vscode 资源树目录加上图标,官方出品的图标库 3、Import Cost 引入包大小计算,对于…

hadoop安装与配置-shell脚本一键安装配置(集群版)

文章目录 前言一、安装准备1. 搭建集群 二、使用shell脚本一键安装1. 复制脚本2. 增加执行权限3. 分发脚本4. 执行脚本5. 加载用户环境变量 三、启动与停止1. 启动/停止hadoop集群(1) 复制hadoop集群启动脚本(2) 增加执行权限(3) 启动hadoop集群(4) 停止hadoop集群(5) 重启hado…

直播预告|StarRocks 3.2 全面解读:易用性和性能的双重提升

StarRocks 3.2 版本即将发布,这是 StarRocks 的又一次重大升级,除了进一步完善存算分离架构、数据湖分析和物化视图等重要特性,我们还聚焦于运维操作细节,大大提升了 StarRocks 的易用性,从建表、表变更、数据导入、查…

数据清洗、特征工程和数据可视化、数据挖掘与建模的应用场景

1.5 数据清洗、特征工程和数据可视化、挖掘建模的应用场景 视频为《Python数据科学应用从入门到精通》张甜 杨维忠 清华大学出版社一书的随书赠送视频讲解1.5节内容。本书已正式出版上市,当当、京东、淘宝等平台热销中,搜索书名即可。内容涵盖数据科学应…

给孩子选台灯需要注意什么?专业的学生台灯推荐

现在的孩子近视率非常高,不少还在上小学的都已经存在佩戴眼镜的现象了,这也让很多家长开始重视起了孩子的视力健康问题。其实孩子近视的主要原因用眼过度,细心的家长可能发现,现在的孩子作业都变多了,经常需要晚上挑灯…

Hive安装步骤

目录 1、安装前提:hadoop全分布 2、卸载MariaDB数据库 (1)设置防火墙服务开启不启动 (2)查看linux自带的MariaDB数据库 (3)卸载linux自带的MariaDB数据库 3、安装mysql数据库 &#xff0…

MySQL系列(十):主从架构

一:主从架构 常见的主从架构模式有四种: 一主多从架构:适用于读大于写的场景,采用多个从库来分担数据库系统的读压力。多主架构:适用于读写参半的场景,采用多个主库来承载数据库系统整体的读写压力。多主…

使用Notepad++编辑器,安装AnalysePlugin搜索插件

概述 是一款非常有特色的编辑器,Notepad是开源软件,Notepad中文版可以免费使用。 操作步骤: 1、在工具栏 ->“插件”选项。 2、勾选AnalysePlugin选项,点击右上角“安装”即可。 3、 确认安装插件 4、下载插件 5、插件已安装…

Leetcode—337.打家劫舍III【中等】

2023每日刷题(五十二) Leetcode—337.打家劫舍III 算法思想 实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(null…

可视化工具Datart小妙招(1)——妙用计算字段

加gzh“大数据食铁兽”,了解更多Datart小妙招 作为目前国内开源版本最好用的可视化工具之一,Datart无疑是低成本高效率可供二开的可视化神兵利器。经过一段时间的使用及磨合,现在总结一些使用的小妙招分享给大家。本篇我们来讲一讲可视化工具…

基于Python guI的学生信息管理系统的设计与实现

基于Python guI的学生信息管理系统的设计与实现 摘要 讲述的是一个使用Python GUI的学习资料管理工具。通过使用Python的Tkinter库和mysql数据库,这个工具可以方便地记录、检索、更新学习资料。本文详细描述了系统的架构设计和实现过程,并对系统进行了功…

语聚AI知识库支持连接数据库,无需上传知识文档,数据分析更高效

数据库系统是企业信息技术基础架构的关键部分,它帮助企业管理和处理其数据,目前已有大量企业通过数据库保存数据,例如员工信息、客户数据、产品销售数据等等。但企业运营变得越来越复杂,数据库中的数据量也在持续增长,…