java基础之接口

news2024/11/13 23:29:34

接口和抽象类很像,接口是把行为给抽象化,可以理解成一个抽象类抽象到极致的情况下,形成的类,也就是一个抽象类有且只有抽象方法的时候,就可以用接口来写。

一、抽象类与接口在书写上的异同

这是一个抽象类

public abstract class Animal {
    public abstract void sleep();
    public abstract void eat();
    }

这是一个接口

public interface Animal { 
        void sleep();
        void eat();
    }

 从书写代码量来看,接口的书写比抽象类要简单的多

抽象类中的“abstract class”变成了“interface”,方法中的“public abstruct”均可省略

二、接口的定义

接口定义使用interface关键字

public interface Run{ void run(); }

        从用的角度来理解接口是怎么由抽象类一步一步演变来的?

        就是一个没有任何属性,全部由抽象方法组成的抽象类

三、接口中的修饰符

1.方法

接口中所有的方法默认都是public abstract 修饰的

2.成员变量

接口中所有的成员变量都由 public static final 修饰,所以记得赋值

理解:接口就是一个行业标准,既然是标准那他就是(共享、开放、不变的,所以它是类(体现出共享)、public(开放)、final(不变)

所谓的行业标准就是在,你想做一件事情不知道该怎么做的时候,去找的一个有指导作用的东西,比如你想开一家茶百道,可是不知道怎么开,这个时候你就选择加盟茶百道,然后按照他的要求去一步一步的达到要求就可以,接口在我们写代码中就是这么一个作用。

四、接口中的构造器,以及多态

1.接口没有构造方法

抽象到极致的抽象类,因为接口没办法new,但是接口可以使用多态(和抽象类类似,让接口引用,指向实现了接口的实体类对象)

因为抽象类可以使用多态,我们创建抽象类目的就是为了让它当父类来使用多态,那您可能就要说了,普通类也可以做父类呀,为什么还要有抽象类?

这是因为普通类无法保证方法的统一性。这句话怎么理解呢?如果普通父类中的方法,子类可以自由选择是否重写,而抽象类中的方法子类必须重写,就满足了使用多态的条件。

接口是抽象到极致的抽象类,所以抽象类可以使用多态,接口也可以

2.小插曲为什么必须重写抽象类的抽象方法?

您可能要说了这是与法规定的,可是我们还是要想一下原因的,这更有助于我们理解和记忆,要我说的话就是,因为子类想当个人,子类想去new对象,类可以看成是一个图纸,按照图纸才能new出对象,可是抽象方法中的抽象方法是不完善的,子类想要去必须把父类的方法完善了,才可以去new出来对象。

public static void main(String[] args) {
    Animal animal = new Cat();
} 

五、接口定义好之后怎么用?

public interface Run {
    void run();
}
public class Dog implements Run{
    @Override
    public void run() {
        System.out.println("我是狗,我会跑");
    }
}

实现接口的类必须实现接口中的所有方法;

如果不实现接口中的所有方法,那么这个类也声明为抽象类,如下

public abstract class Person implements Animal{//声明为抽象类,因为未实现sleep方法
    @Override
    public void eat() {
        
    }
}

六、接口与接口,接口与类之间的关系

1.接口和接口之间可以继承,同时支持多继承(java的类只支持单继承,但是接口支持多继承)

2.接口和类之间是实现关系,并且一个类可以实现多个接口

接口之间的多继承

类若想实现多继承功能

public class Cow extends Animal implements Run,Eat{
@Override
public void jump() {
//TODO Auto-generated method stub
}
@override
public void drunk() {
//TODO Auto-generated method stub
}
}

3.为什么接口可以多继承呢,类不支持多继承?

  • java类中如果多继承可能两个父类有相同的方法会冲突,接口中方法都没有方法块,只有方法名
  • 具体的实现都由实现接口的类决定 接口里的方法是抽象的,没有具体内容就可以直接去重,但是类就得作取舍

理解:这时候就有要提到《道德经》中的一句话了 “有之以为利,无之以为用”,放到这就是父类里面的方法可能是写好的,非常便利可以直接使用,接口中是除了方法签名什么都没有的,就像一个器皿,里面装什么是自己决定的,告诉你一个方向,怎么发展靠自己。

public interface A extends B,C{
}

4.与继承类似,接口和实现类之间存在多态

5、什么是接口回调

通过下面的代码理解一下:

首先定义一个接口Usb:

  • 首先定义一个接口Usb: 
public interface Usb {
    void service();
}
  • 然后我们定一个接口使用者 

 注意:此时接口没被实现,就已经出现了接口的调用者,这个过程就叫做接口回调

//定义接口的使用者
public class Computer {
    //用的过程
    Usb usb1;
    Usb usb2;
    Usb usb3;
    public void run()
    {
        if(usb1 != null){//如果第一个接口插着东西
            //这就是接口的使用此时接口的使用这就出现了,可是此时接口还没有被实现
            usb1.service();
        }
        if(usb2 != null){
            usb2.service();
        }
        if(usb2 != null){
            usb2.service();
        }
    }
}
  • 下面我们定义接口的实现者
public class Fengshan implements Usb{
    @Override
    public void service() {
        System.out.println("风扇启动了");
    }
}
public class Mouse implements Usb{
    @Override
    public void service() {
        System.out.println("鼠标启动了");
    }
}
public class Upan implements Usb{
    @Override
    public void service() {
        System.out.println("U盘启动了");
    }
}
  •  现在测试一下
public class Test {
    public static void main(String[] args) {
        Computer computer = new Computer();
        //在usb1接口上插上鼠标
        computer.usb1 = new Mouse();
        //在usb2接口上插上风扇
        computer.usb2 = new Fengshan();
        //在usb3接口上插上U盘
        computer.usb3 = new Upan();
        computer.run();
    }
}

七、接口和抽象类的异同:

  • 1、接口中的方法默认是抽象方法,在接口中不能有实现(java8开始允许接口方法有默认实现,使用default关键字);抽象类可以有非抽象方法)
public interface A {
    default void have(){
        System.out.println("我有A");
    }
}

此时Cat不一定非要重写A接口中的hava方法

public class Cat implements Animal,A{
    @Override
    public void sleep() {

    }

    @Override
    public void eat() {

    }


}

 

  • 2、接口中的变量默认是final类型,抽象类中则不一定
  • 3、一个类可以实现多个接口,但是最多只能继承一个抽象类
  • 4、一个了尅实现接口的话,需要实现接口中的所有方法,而抽象类则不一定
  • 5、从设计层来说,抽象对类的抽象,是一种模版设计,而接口是行为的抽象是一种行为的规范

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

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

相关文章

jmeter-beanshell学习8-for循环

一个稍微有点难度的东西 要把响应结果的所有名字都取出来,然后怎么处理看自己需求。比如找某个人是不是在这里,或者把所有人都写进一个文档,我就不编场景了 第一步想要取出所有名字,还得靠万能的正则表达式提取器,jso…

零信任的架构结合模块化沙箱,实现一机两用的解决方案

零信任沙箱是深信达提出的一种数据安全解决方案,它将零信任原则与SDC沙箱技术的优势相结合。零信任原则是一种安全概念,核心思想是“永不信任,总是验证”。它要求对每一个访问请求都进行严格的身份验证和授权,无论请求来源于内部还…

Androidstudio安卓开发,SharedPreferences实现登录注册

1. 项目涉及到的技术点 SharedPreferences的使用 2. 效果图 3. 实现过程 注册布局文件&#xff1a;activity_register.xml <?xml version"1.0" encoding"utf-8"?> <androidx.appcompat.widget.LinearLayoutCompat xmlns:android"http:…

Python 爬虫:使用打码平台来识别各种验证码:

本课程使用的是 超级鹰 打码平台&#xff0c; 没有账户的请自行注册&#xff01; 超级鹰验证码识别-专业的验证码云端识别服务,让验证码识别更快速、更准确、更强大 使用打码平台来攻破验证码难题&#xff0c; 是很简单容易的&#xff0c; 但是要钱&#xff01; 案例代码及测…

【C语言】实践:贪吃蛇小游戏(附源码)

欢迎光顾我的homepage 前言 贪吃蛇小游戏想必大家都玩过吧&#xff0c;现在就要C语言代码来实现一下贪吃蛇小游戏 在实现之前&#xff0c;我们要对C语言结构体、指针、链表(单链表)有一定的基础 先来看一下预期运行效果 一、Win32 API 这里实现贪吃蛇游戏会使用一些Win32 AP…

7.8~7.10练习

目录 1.扑克牌游戏 2.链表基本功能的实现&#xff08;单项链表&#xff09; 3.移除链表元素力扣 4.反转链表力扣 5.链表的中间结点 5.返回倒数第k个节点​编辑 6.合并两个有序链表 7.链表基本功能的实现&#xff08;双向链表&#xff09; 8.链表分割 1.扑克牌游戏 public…

新手教学系列——高效管理MongoDB数据:批量插入与更新的实战技巧

前言 在日常开发中,MongoDB作为一种灵活高效的NoSQL数据库,深受开发者喜爱。然而,如何高效地进行数据的批量插入和更新,却常常让人头疼。今天,我们将一起探讨如何使用MongoDB的bulk_write方法,简化我们的数据管理流程,让代码更加简洁高效。 常规做法:find、insertone…

LabVIEW扬尘控制系统

设计了一套基于LabVIEW的扬尘控制系统&#xff0c;通过监测TsP&#xff08;总悬浮颗粒物&#xff09;浓度、风向和摄像头视频&#xff0c;实现对环境的综合监控和扬尘控制。系统可以自动判断扬尘位置&#xff0c;并驱动抑尘设备进行抑尘。硬件选用NI cDAQ-9178数据采集模块、Om…

9.5 栅格图层符号化多波段彩色渲染

文章目录 前言多波段彩色渲染QGis设置为多波段彩色二次开发代码实现多波段彩色 总结 前言 介绍栅格图层数据渲染之多波段彩色渲染说明&#xff1a;文章中的示例代码均来自开源项目qgis_cpp_api_apps 多波段彩色渲染 以“3420C_2010_327_RGB_LATLNG.tif”数据为例&#xff0c…

26.7 Django单表操作

1. 模型管理器 1.1 Manager管理器 Django ORM中, 每个Django模型(Model)至少有一个管理器, 默认的管理器名称为objects. objects是一个非常重要的管理器(Manager)实例, 它提供了与数据库进行交互的接口.通过管理器, 可以执行数据库查询, 保存对象到数据库等操作.objects管理器…

MT6825磁编码IC在智能双旋机器人中的应用

MT6825磁编码IC在智能双旋机器人中的应用&#xff0c;无疑为这一领域的创新和发展注入了新的活力。作为一款高性能的磁性位置传感器&#xff0c;MT6825以其独特的优势&#xff0c;在智能双旋机器人的运动控制、定位精度以及系统稳定性等方面发挥了关键作用。 www.abitions.com …

【Web开发手礼】探索Web开发的魅力(三)-html基础标签(3)

上述主要是对html标签的介绍和一些基本练习可以当作日常笔记收藏一下&#xff01;&#xff01;&#xff01; 目录 前言 html基础标签 前言 上述主要是对html标签的介绍和一些基本练习可以当作日常笔记收藏一下&#xff01;&#xff01;&#xff01; 提示&#xff1a;以下是本…

Kithara与OpenCV (二)

Kithara使用OpenCV QT 进行特征检测 目录 Kithara使用OpenCV QT 进行特征检测OpenCV 特征检测简介Qt应用框架简介项目说明关键代码抖动测试测试平台&#xff1a;测试结果&#xff1a;结论 OpenCV 特征检测简介 OpenCV是一个开源的计算机视觉库&#xff0c;提供了各种图像处理…

WordPress 主题技巧:给文章页增加“谁来过”模块。

模块功能&#xff1a; 我个人目前在做一个电影类的网站&#xff0c;在开发文章页的模版时候&#xff0c;突然觉得给文章页增加一个“谁对本电影感兴趣”的功能模块可能会比较有趣&#xff0c;这个功能有点类似于‘足迹’的感觉&#xff0c;用户可以通过这个功能&#xff0c;发…

昇思25天学习打卡营第14天|K近邻算法实现红酒聚类

红酒Wine数据集 类别(13类属性)&#xff1a;Alcohol&#xff0c;酒精&#xff1b;Malic acid&#xff0c;苹果酸 Ash&#xff0c;灰&#xff1b;Alcalinity of ash&#xff0c;灰的碱度&#xff1b; Magnesium&#xff0c;镁&#xff1b;Total phenols&#xff0c;总酚&#xf…

tkinter-TinUI-xml实战(12)pip可视化管理器

引言 pip命令行工具在平常使用方面确实足够简单&#xff0c;本项目只是作为TinUI多界面开发的示例。 当然&#xff0c;总有人想用GUI版pip&#xff0c;实际上也有。不过现在&#xff0c;我们就来手搓一个基于python和TinUI&#xff08;tkinter&#xff09;的pip可视化管理器。…

102.qt qml-最全Table交互之多列固定、行列拖拽、自定义委托、标题交互使用教程

自定义实现的Table控件&#xff0c;支持跨qt版本&#xff0c;兼容qt5,qt6&#xff01; 截图如下所示: 黑色风格如下所示&#xff1a; 视频演示入口&#xff1a;Qt QML QianWindowV2.5(新增曲线综合示例、QML最全Table交互示例、支持qt5/qt6)_哔哩哔哩_bilibili 1.示例页面入口…

Python爬虫技术从去哪儿网获取旅游数据,对攻略进行可视化分析,提供全面的旅游攻略和个性化的出行建议

背景 随着信息技术的快速发展和互联网的普及&#xff0c;旅游行业也迎来了数字化和智能化的变革。去哪儿网作为中国领先的在线旅游平台之一&#xff0c;提供了丰富的旅游产品和服务&#xff0c;涵盖了机票、酒店、旅游度假等各个方面。用户通过去哪儿网可以方便地查询、预订和…

羧基聚乙二醇生物素的制备方法;COOH-PEG-Biotin

羧基聚乙二醇生物素&#xff08;COOH-PEG-Biotin&#xff09;是一种常见的生物分子聚合物&#xff0c;具有多种应用&#xff0c;特别是在生物实验、药物研发和生物技术等领域。以下是对该化合物的详细解析&#xff1a; 一、基本信息 名称&#xff1a;羧基聚乙二醇生物素&#x…

C/C++ 进阶(7)模拟实现map/set

个人主页&#xff1a;仍有未知等待探索-CSDN博客 专题分栏&#xff1a;C 一、简介 map和set都是关联性容器&#xff0c;底层都是用红黑树写的。 特点&#xff1a;存的Key值都是唯一的&#xff0c;不重复。 map存的是键值对&#xff08;Key—Value&#xff09;。 set存的是键…