【JAVA学习笔记】41 - 接口

项目代码

https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter10/src/com/yinhai/interface_

一、快速入门

                

        usb插槽就是现实中的接口。你可以把手机,相机,u盘都插在usb插槽上,而不用担心那个插槽是专门插哪个的,原因是做usb的厂家和做各种设备的厂家都遵守了统一的规定包括尺寸,排线等等。

        这样的设计需求在java编程/ php/.net/go中也是会大量存在的,程序就是一个世界,在现实世界存在的情况,在程序中也会出现。使用代码模拟。        interface01

public interface UsbInterface {//创建一个规范,相当于个法则,要想用接口就得有这两个方法
    public void start();

    public void stop();
}
//Phone 类实现UsbInterface
//解读1.即Phone类需要实现UsbInterface接口 规定/声明的方法
public class Phone implements UsbInterface{
    //实现接口,本质就是把接口的方法实现,相当于在规范内实现我自己类的方法
    public void start(){
        System.out.println("手机开始工作...");
    }
    public void stop(){
        System.out.println("手机停止工作...");
    }
}
public class Camera implements UsbInterface{//
    @Override
    public void start() {
        System.out.println("相机开始工作...");
    }

    @Override
    public void stop() {
        System.out.println("相机停止工作...");
    }
}
public class Computer {
    //编写一个方法
    public void work(UsbInterface usbInterface){//创建了个接口,用来接入对象的方法
        usbInterface.start();
        usbInterface.stop();
    }
}
public class Interface01 {
    public static void main(String[] args) {
        //创建手机相机对象
        Camera camera = new Camera();
        Phone phone = new Phone();
        Computer computer = new Computer();
        computer.work(phone);//把手机接入到电脑
        System.out.println("===============");
        computer.work(camera);
    }
}

二、基本介绍 

        接口就是给出一些没有实现的方法,封装到一起到某个类要使用的时候,在根据具体情况把那

些方法写出来。语法: 

        interface 接口名{

                //属性

                //方法(1.抽象方法 2默认实现方法 3静态方法)

        }

        class 类名 implements 接口{

                自己属性;

                自己方法;

                必须实现的接口的抽象方法

        }

1.在Jdk7.0前 接口里的所有方法都没有方法体,即都是抽象方法。

2.Jdk8.0后接口可以有静态方法,默认方法,也就是说接口中可以有方法的具体实现
 

public interface AInterface {
    //写属性
    public int n1 = 10;
    //写方法
    public void hi();//在接口中可以省略abstract关键字
    //jdk 8 后可以有默认实现方法,但是需要使用default关键字修饰
    default public void ok() {
        System.out.println("OK");
    }
    //在jdk8后可以有静态方法
}
//1.如果一个类implements实现接口
//2.需要该接口的所有抽象方法都实现
class A implements AInterface{
    public void hi(){
        System.out.println("hi().....");
    }
}

三、深入讨论

对初学者讲,理解接的概念不算太难,难的是不知道什么时候使用接口,下面我例举几个应用场景:

1.说现在要制造战斗机.武装直升机专家只需把飞机需要的功能/规格定下来即可,然后让别的人具体实现就可。

2.说现在有一个项目经理,管理三个程序员,功能开发一个软件为了控制和管理软件项目经理可以定义一些接口,然后由程序员具体实现。

实际要求: 3个程序员, 编写三个类,分别完成对Mysql,Oracle,DB2数据库的连接

                

public interface DBInterface { //项目经理

    public void connect();//连接方法
    public void close();//关闭连接
}
public class MysqlDB implements DBInterface {
    @Override
    public void connect() {
        System.out.println("连接mysql");
    }

    @Override
    public void close() {
        System.out.println("关闭mysql");
    }
}
//B程序员连接Oracle
public class OracleDB implements DBInterface{

    @Override
    public void connect() {
        System.out.println("连接oracle");
    }

    @Override
    public void close() {
        System.out.println("关闭oracle");
    }
}
public class Interface03 {
    public static void main(String[] args) {

        MysqlDB mysqlDB = new MysqlDB();
        t(mysqlDB);
        OracleDB oracleDB = new OracleDB();
        t(oracleDB);
    }

    public static void t(DBInterface db) {
        db.connect();
        db.close();
    }
}

四、注意事项和细节

1.接口不能被实例化 (接口实际上是特殊抽象类)

2.接口中所有的方法是public方法,接口中抽象方法,可以不用abstract 修饰:

        实际上是abstract void aa();

3.一个普通类实现接口,就必须将该接口的所有方法都实现。

        将光标放到红线使用alt+enter可以快速实现接口方法

        

4.抽象类实现接口,可以不用实现接口的方法。

5.一个类可以同时实现多个接口

6.接口中的属性只能是final的,而且是public static final修饰符。

        比如:int a=1;实际上是public static finai int a=1; (必须初始化)

        

7.接口中属性的访向形式:接口名.属性名

8.一个接口不能继承其它的类但是可以继承多个别的接口

9.接口的修饰符只能是public和默认,这点和类的修饰符是一样的。

五、课堂练习

1.

                

        都正确,因为B实现了A接口,当然拥有接口的成员

六、接口和继承类之间的关系

        可以看做继承类的补充

                

一个对象创建开始就应该继承有父类的内容,但是要有其他功能需要实现接口的方式拓展,可以理解为对java单继承机制的一种补充

public class ExtendsvsInterface {
    public static void main(String[] args) {
        LittleMonkey houzi = new LittleMonkey("houzi");
        houzi.climbing();
        houzi.swimming();
    }
}
interface Fishable{
    void swimming();
}
class Monkey{
    private String name;

    public Monkey(String name) {
        this.name = name;
    }
    public void climbing(){
        System.out.println(name + "会爬树");
    }

    public String getName() {
        return name;
    }
}
class LittleMonkey extends Monkey implements Fishable{

    public LittleMonkey(String name) {
        super(name);
    }
    public void swimming(){
        System.out.println(getName() + "通过学习,可以像鱼一样游泳");
    }
}

1.接口和继承解决的问题不同

        继承的价值主要在于:解决代码的复用性和可维护性。

        接口的价值主要在于:设计设计好各种规范(方法),让其它类去实现这些方法。

2.接口比继承更加灵活

        接口比继承更加灵活,继承是满足is - a的关系,而接口只需满足like - a的关系。

3.接口在一定程度上实现代码解耦【即 接口规范性和动态绑定】

七、多态特性

1.多态参数

        在前面的Usb接口案例,Usb usb,既可以接收手机对象,又可以接收相机对象,就体现了接口多态(接口引用可以指向实现了接口的类的对象)

        传入的对象可以是不同类型,只要是完成了实现接口的对象都可以传入

        接口类型的变量If01 可以指向实现了IF接口的类的对象实例

        ​​​​​​​        

2.多态数组

        案例:给Usb数组中,存放Phone和相机对象,Phone类还有一个特有的方法call
() ,请遍历Usb数组,如果是Phone对象,除了调用Usb接口定义的方法外,还需要调用
Phone特有方法call.

public class InterfacePolyArr {
    public static void main(String[] args) {
        Usb[] usbs = new Usb[2];
        usbs[0] = new Phone_();
        usbs[1] = new Camera_();
        for (int i = 0; i < usbs.length; i++) {
            usbs[i].work();//动态绑定
            if(usbs[i] instanceof Phone_){//判断运行类型是phone
                ((Phone_) usbs[i]).call();//向下转型
            }
        }
    }
}

interface Usb {
    void work();
}

class Phone_ implements Usb {

    @Override
    public void work() {
        System.out.println("手机工作中");
    }
    public void call(){
        System.out.println("手机打电话中");
    }
}

class Camera_ implements Usb {
    @Override
    public void work() {
        System.out.println("相机工作中");
    }
}

3.接口存在多态传递现象

/*
 *  演示多态传递现象
 */
public class InterfacePolyPass {
    public static void main(String[] args) {
        IG ig = new Teacher();
        IH ih = new Teacher();
    }
}
interface IH{
    void hi();
}
interface IG extends IH{}
class Teacher implements IG{//也就是说想要实现IG接口,需要把IG的父类的方法也实现才能调用

    @Override
    public void hi() {
        
    }
}

八、课堂练习

interface A { // 1min看看
    int x = 0; //想到等价于 public static final int x = 0;
}

class B {
    int x = 1;
}

class C extends B implements A {
    public void pX() {
        System.out.println(x);//调用的x不知道是哪一个 考虑改为
        //System.out.println(super.x);
        //System.out.println(A.x);//A是静态的
    }

    public static void main(String[] args) {
        new C().pX();
    }
}

输出1

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

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

相关文章

Git基本概念与使用

一、Git基本概念 git&#xff0c;是一种分布式版本控制软件&#xff0c;与CVS、Subversion这类的集中式版本控制工具不同&#xff0c;它采用了分布式版本库的作法&#xff0c;不需要服务器端软件&#xff0c;就可以运作版本控制&#xff0c;使得源代码的发布和交流极其方便。g…

信奥赛一本通:数据排序(合影效果、病人排队、明明的随机数、单词排序、出现次数超过一半的数、统计字符数)

数据排序 1182&#xff1a;合影效果1183&#xff1a;病人排队1184&#xff1a;明明的随机数1185&#xff1a;单词排序1186&#xff1a;出现次数超过一半的数1187&#xff1a;统计字符数 1182&#xff1a;合影效果 由题目可知&#xff0c;n个人有 性别与身高两种属性&#xff0c…

Elasticsearch实践:ELK+Kafka+Beats对日志收集平台的实现

可以在短时间内搜索和分析大量数据。 Elasticsearch 不仅仅是一个全文搜索引擎&#xff0c;它还提供了分布式的多用户能力&#xff0c;实时的分析&#xff0c;以及对复杂搜索语句的处理能力&#xff0c;使其在众多场景下&#xff0c;如企业搜索&#xff0c;日志和事件数据分析等…

PDF Reader Pro v2.9.8(pdf编辑阅读器)

PDF Reader Pro是一款PDF阅读和编辑软件&#xff0c;具有以下特点&#xff1a; 界面设计简洁&#xff0c;易于上手。软件界面直观清晰&#xff0c;用户可以轻松浏览文档&#xff0c;编辑注释和填写表单。功能强大&#xff0c;提供了多种PDF处理工具&#xff0c;包括阅读、注释…

北邮22级信通院数电:Verilog-FPGA(6)第六周实验:全加器(关注我的uu们加群咯~)

北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章&#xff0c;请访问专栏&#xff1a; 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 作者建群啦&#xff01;&#xff01;&#xff01;欢…

基于​Segment-and-Track Anything与ProPainter实现视频一键目标移除与一键祛除水印

一、 ProPainter 1.算法简介 ProPainter是由新加坡南洋理工大学&#xff08;Nanyang Technological University&#xff09;的S-Lab团队开发的一款视频修复工具。它融合了图像和特征修复的优势&#xff0c;以及高效的Transformer技术&#xff0c;旨在提供高质量的视频修复效果…

libcurl Socks5 堆缓冲区溢出漏洞(CVE-2023-38545)详细分析

简介 curl 是用于在各种网络协议之间传输数据的命令行工具&#xff0c;libcurl 用于提供处理网络通信和数据传输的 Api 接口。curl 默认下载缓冲区为 102400 字节&#xff0c;但如果设置低于每秒 102400 字节&#xff0c;缓冲区大小会自动设置为更小的值。libcurl 下载缓冲区默…

AIO开放接口平台免费畅享ChatGPT聊天、联网互动、学术等服务!更有DALL·E 3最强AI绘图功能!

免费畅享&#xff01; AIO平台ChatGPT联网、聊天、学术等服务&#xff01; AIO开放接口平台 | 服务介绍 ALL IN ONE &#xff08;AIO&#xff09;API服务是LLM(大语言模型)开放接口平台&#xff1a;持续接入各种主流的大模型接口&#xff0c;并提供简单、易用、统一的API交互…

第四章 路由基础

目录 4.1 路由器概述 4.1.1 路由器定义 4.1.2 路由器工作原理 4.1.3 路由表的生成方式 &#xff08;1&#xff09;直连路由 &#xff08;2&#xff09;静态路由 &#xff08;3&#xff09;动态路由 4.1.4 路由器的接口 &#xff08;1&#xff09;配置接口 &#xff0…

css中px、em、rem、%、vw、vh、vm、rpx 这些单位的区别

序言 px&#xff1a;像素 相对长度单位&#xff0c;相对于显示器屏幕分辨率(推荐使用) em&#xff1a;相对长度单位 基准点为父节点字体的大小&#xff0c;如果自身定义了font-size按自身来计算&#xff08;浏览器默认字体是16px&#xff09;&#xff0c;整个页面内1em不是一个…

如何将 Helm Chart 推送至 Harbor ?

Author&#xff1a;rab 前言&#xff1a;我们说 Helm 的私有仓库可以是任何 HTTP Server&#xff08;如 Nginx、Apache 等&#xff09;&#xff0c;而 Harbor 自带 Helm 私有仓库的功能&#xff08;但默认是禁用的&#xff0c;需要我们手动启用&#xff09;&#xff0c;如果为了…

电子元器件管理系统 JAVA语言开发

目录 一、系统介绍 二、系统下载 三、系统截图 一、系统介绍 基于VueSpringBootMySQL的电子元器件管理系统包含元器件单位模块、元器件仓库模块、元器供应商模块、元器件品类模块、元器件明细模块、元器件采购模块、元器件采购审核模块、元器件领用模块、学生元器件申请模块…

Cisco IOS XE Web UI 命令执行漏洞

Cisco IOS XE Web UI 命令执行漏洞 受影响版本 Cisco IOS XE全版本 漏洞描述 Cisco IOS XE Web UI 是一种基于GUI的嵌入式系统管理工具&#xff0c;能够提供系统配置、简化系统部署和可管理性以及增强用户体验。它带有默认映像&#xff0c;因此无需在系统上启用任何内容或安…

ideaSSM在线商务管理系统VS开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 SSM 在线商务管理系统是一套完善的信息管理系统&#xff0c;结合SSM框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码 和数据库&#xff0c;系统主…

VS Code C# 开发工具包正式发布

前言 微软于本月正式发布Visual Studio Code C#开发工具包&#xff0c;此前该开发套件已经以预览版的形式在6月份问世。经过4个月的测试和调整&#xff0c;微软修复了350多个问题&#xff0c;其中大部分是用户反馈导致的问题。此外&#xff0c;微软还对产品进行了300多项有针对…

OpenCV 笔记(3):基本图形的绘制

Part11. 绘制简单的图形 绘图功能是 OpenCV 最基础的功能&#xff0c;OpenCV 提供了基础的绘制函数&#xff0c;用于帮助我们绘制一些基本的图形。通过这些函数的组合&#xff0c;我们也可以做一些高级的应用。 11.1 绘制点和圆 OpenCV 的绘制函数相对简单&#xff0c;而且很多…

WPF Material Design UI框架

前言 Material Design in xaml 是开源免费的ui框架&#xff0c;工控软件主打的就是简单界面。 以下简称MD 相关资源 MaterialDesignInXamlToolkit Github 地址 MD 快速启动 MD 案例压缩包 MD 框架使用 启动环境配置 安装Nuget包 App.xaml 配置 <Application x:Class&qu…

部署:端口映射相关问题

图片仅作示意用途 在很多现场部署环境里&#xff0c;网络管理是相对严格的&#xff0c;设备所在的子网如果需要和办公网所在的服务器通讯&#xff0c;需要通过专门的中间节点&#xff0c;一般还有严格的防火墙配置。此时&#xff0c;研发环境里&#xff0c;服务器与设备子网各…

在edge浏览器中安装好了burp的ca证书,浏览器依旧不能访问https的原因

在edge浏览器中安装好了burp的ca证书&#xff0c;浏览器依旧不能访问https的原因 1.SwitchyOmega代理插件设置2.CA证书方法1方法2 1.SwitchyOmega代理插件设置 严格安装以下图片执行&#xff0c;不可少写或多写 2.CA证书 方法1 下载好证书&#xff0c;先导入到edge浏览器的中…

linux下部署nacos(单机、集群)

文章目录 nacos简介单机部署集群部署部署常见问题 官网文档地址&#xff1a;https://nacos.io/zh-cn/docs/deployment.html github地址&#xff1a;https://github.com/alibaba/nacos nacos简介 Nacos&#xff0c;全称阿里巴巴开源的动态服务发现、配置和服务管理平台&#x…