• Java基础之接口(interface)详解


    Java核心技术卷的一个简单笔记


    前言

    总结一下基础阶段接口常见的问题

    1.接口的概念

    接口 ,由于Java没有多继承,只有单继承,那么需要多个类同时满足一些需求的时候怎么办呢。这就是接口的设计意义,它是希望符合这个接口的类满足的一些需求。可以看作是一种规范。

    public interface Comparable {
    	
    }
    
    • 1
    • 2
    • 3

    2.接口的声明格式

    [修饰符] interface 接口名{
    
     // 公共的静态常量
     // 公共的抽象方法
     
     // 公共的默认方法(JDK1.8 以上)
     // 公共的静态方法(JDK1.8 以上)
     // 私有方法(JDK1.9 以上)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    为什么Java8以后允许公共的静态方法,和默认方法呢

    静态方法
    因为之前的标准类库设计中,有很多 Collection/Colletions 或者Path/Paths 这样成对的接口和类,后面的类中都是静态方法,而这些静态方法都是为前面的接口服务的,那么这样设计一对 API,不如把静态方法直接定义到接口中使用和维护更方便。
    默认方法
    (1)我们要在已有的老版接口中提供新方法时,如果添加抽象方法,就会涉及到原来使用这些接口的类就会有问题,那么为了保持与旧版本代码的兼容性,只能允许在接口中定义默认方法实现。比如:Java8 中对Collection、List、Comparator 等接口提供了丰富的默认方法。
    (2)当我们接口的某个抽象方法,在很多实现类中的实现代码是一样的,此时将这个抽象方法设计为默认方法更为合适,那么实现类就可以选择重写,也可以选择不重写。
    Tips:Java9可以用私有方法
    使用的的很有限,因为private导致只能在几口本身的方法中使用,用途有限,更多是最为接口中其他方法的辅助方法

    3.接口的属性

    (1)接口不是类。不可以用new实例化接口
    (2)可以声明接口,用实现了接口的类来实现
    (3)可以用instanceof‘判断对象是都属于哪个接口
    (4)接口中所有的方法被设置为public,所有变量总是默认为public static final
    
    • 1
    • 2
    • 3
    • 4

    4.接口和抽象类的区别

    接口(interface)和抽象类最大的区别是多继承和单继承的问题导致的。引入接口的原因也是因为Java是单继承语言,抽象类有着和接口类似的功能,但是限制于单继承。一个类只能继承一个抽象类但是却可以实现多个接口,这就是接口类似于多继承功能的优势。一般来说能设计成接口尽量设计成接口。抽象类和接口还有一些具体的不同。接口可以继承大多数多继承的优势,同时避免多继承的复杂性和低效性。
    在这里插入图片描述

    5.继承和接口混合使用的一些规则

    (1)接口可以继承多个接口,关键字是extends,
    (2)可以同时继承父类和实现接口,继承关键字在前,实现关键字在后
    (3)接口与实现类对象构成多态引用,实现类实现接口,类似于子类继承父类.
    	因此,接口类型的变量与实现类的对象之间,也可以构成多态引用。通过
    	接口类型的变量调用方法,最终执行的是你 new 的实现类对象实现的方法体。
     (4)接口不能直接创建对象,但是可以通过接口名直接调用接口的静态方法和静态常量
     (5)对于接口的静态方法,直接使用“接口名.”进行调用即可
        也只能使用“接口名."进行调用,不能通过实现类的对象进行调用
        对于接口的抽象方法、默认方法,只能通过实现类对象才可以调用
        接口不能直接创建对象,只能创建实现类的对象
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    (1) interface A extends 接口1,接口2 {
    }2class B extends C implements 接口1,接口2 {
    }3)不粘贴具体代码,比较长,自己可以下去谢谢
    
    (4)接口.静态方法名()
    	接口.静态变量
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    6.继承父类和实现接口时的一些同名冲突问题

    我们思考一下这个问题,一个类同时可以继承一个父类和实现多个接口。那么,冲突主要来自如下几种情况:

    • 父类和接口之间同名冲突
    • 实现的多个接口之间的同名冲突
      那么来看看怎么解决吧,分为方法名冲突和变量名冲突

    6.1方法名冲突

    (1)对于父类和接口之间的同名冲突
    遵守的是类优先原则,当一个类,既继承一个父类,又实现若干个接口时,父类中的成员方法与接口中的抽象方法重名,子类就近选择执行父类的成员方。

    (2)实现的多个接口之间的同名冲突。
    当一个类同时实现了多个父接口,而多个父接口中包含方法签名相同的默认方法时,怎么办呢?

    • 声明接口:选择保留其中一个,通过“接口名.super.方法名"的方法选择保留哪个接口的默认方法。

    当一个子接口同时继承了多个接口,而多个父接口中包含方法签名相同的默认方法时,怎么办呢?

    • 子接口重写默认方法
    • 子接口重写默认方法时,default关键字可以保留。
    • 子类重写默认方法时,default关键字不可以保留。

    6 .2常量名冲突

    (1)当子类继承父类又实现父接口,而父类中存在与父接口常量同名的成员变量,并且该成员变量名在子类中仍然可见。
    通过“接口名.变量名"的方法引用父接口的成员变量

    (2)当子类同时实现多个接口,而多个接口存在相同同名常量。
    此时在子类中想要引用父类或父接口的同名的常量或成员变量时,就会有冲突问题。

    通过“super.变量名"的方法引用父类的成员变量

  • 相关阅读:
    Android HAL - hidl-gen
    [C++随想录] map和set的使用
    Redis 有序集合 zset ( sorted set )
    Linux - Linux下Java安装路径查找;配置Java环境变量
    如何避免JavaScript中的内存泄漏?
    C++ PrimerPlus 复习 第八章 函数探幽
    【内网安全】搭建网络拓扑,CS内网横向移动实验
    我的2023年:程序员的自我迭代、技术复盘与生活点滴
    apache poi 实现Excel 下拉联动
    如何计算Renko大小,FPmarkets用ATR3步计算
  • 原文地址:https://blog.csdn.net/m0_46285887/article/details/131082083