面向对象之接口与抽象性

Posted zhufeng123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象之接口与抽象性相关的知识,希望对你有一定的参考价值。

一、接口(interface)

  1、定义

    • 接口就是规范,定义的是一组规则,体现了现实世界中“如果你是/要...则必须能...”的思想。继承是一个"是不是"的关系,而接口实现则是 "能不能"的关系
    • 接口的本质是契约,标准,规范,就像我们的法律一样。制定好后大家都要遵守
    • 一个类可以实现多个接口,可以得到多重继承的效果

  2、接口的使用说明(JDK7及以前)

    • ① Java中,接口(interface) 是与类(class)并列的结构
    • ② 如何定义一个接口:使用interface关键字
    • ③ 接口中只能定义全局常量和抽象方法
      • 全局常量:public static final的,但是书写时,可以省略不写

       技术图片

      • 抽象方法:public abstract修饰

       技术图片

    • ④ 接口中不能定义构造器,意味着接口不可以实例化。

       技术图片

    • ⑤ Java开发中,接口通过让类去实现(implements)的方式来使用
      • 类实现接口以后,就获取了接口中声明的结构:常量、抽象方法
      • 如果实现类覆盖了接口中的所有抽象方法,则此实现类就可以实例化

       技术图片

      • 如果实现类没有覆盖接口中所有的抽象方法,则此实现类仍为一个抽象类

        技术图片

    • ⑥ Java类可以实现多个接口
      • 弥补了Java单继承性的局限性
      • 格式:class AA extends BB implements CC,DD,EE

        技术图片

    • ⑦ 接口与接口之间可以继承,而且可以多继承

技术图片

    • ⑧ 接口的具体使用,体现多态性

技术图片

    • ⑨ 接口的主要用途就是被实现类实现。(面向接口编程)

  3、Java8中接口的新规定

    • ① 接口中可以定义静态方法、默认方法

技术图片

    • ② 接口中定义的静态方法,只能通过接口进行调用,无法通过实现类及其对象调用

技术图片

    • ③ 接口中定义的默认方法,可以通过实现类的对象调用,无法通过实现类调用

技术图片

    • ④ 如果类实现的接口和继承的父类中,定义了同名同参数的方法,那么子类在没重写此方法的情况下,默认调用的是父类中声明的方法。“类优先”原则
    • ⑤ 如果实现类实现了多个接口,而这多个接口中定义了同名同参数的默认方法,那么在实现类没有重写此方法的情况下,会出现接口冲突问题。要求实现类必须重写接口中的方法
    • ⑥ 如何在子类(或实现类)的方法中调用父类、接口中被重写的方法

技术图片

    • ⑦ 类实现接口以后,(1)要么实现接口中的所有抽象方法,方可实例化;(2)要么当前类声明为抽象类(因为内部包含从接口中获取的抽象方法)
    • ⑧ 类可以继承多个接口,接口也可以继承接口,一定程度上解决了类的单继承性;接口与接口之间可以多继承也可以单继承

  4、创建接口匿名实现类的对象

    • 1.创建了接口的非匿名实现类的非匿名对象

技术图片

    • 2. 创建了接口的非匿名实现类的匿名对象

技术图片

    • 3.创建了接口的匿名实现类的非匿名对象

技术图片

    • 4. 创建了接口的匿名实现类的匿名对象

技术图片

  5、接口的应用

    • 代理模式(Proxy)
      • 概述:代理模式是Java开发中使用较多的一种设计模式。代理设计就是为其他对象提供一种代理以控制对这个对象的访问

技术图片

      • 应用场景

技术图片

    • 工厂模式

  6、implements(实现)

    • 语义:implements是接口(interface)中的一个关键词,用来让类实现接口
    • 使用场景:
      • ① 实体类与接口之间的实现
      • ② 抽象类与接口之间的实现

二、抽象性

  1、定义

    • 抽象性也可以作为面向对象的一个特征
    • 可以用来修饰的结构:类、方法
    • abstract:抽象的

  2、抽象性体现

    1)修饰类:class abstract 类名{类中结构}

      • ① 此类不能实例化

        技术图片

      • ② 抽象类中一定有构造器,便于子类实例化时调用(涉及:子类对象实例化的全过程)
      • ③ 开发中,都会提供抽象类的子类,让子类对象实例化,调用父类的结构,完成相关的操作
      • ④ 抽象类中不一定有抽象方法;反之,包含抽象方法的类,一定是一个抽象类

    2)修饰方法:权限修饰符 abstract 返回值类型 方法名(形参)

      • ① 抽象方法只有方法的声明,没有方法体,所有此方法一定不能被调用
      • ② 若子类重写了父类中的所有的抽象方法后,此子类方可实例化

技术图片

      • ③ 若子类没有重写父类(包括间接父类)中的所有的抽象方法,则此子类也是一个抽象类,需要使用abstract修饰

技术图片

    3)注意:

      • ① 前提:抽象性使用的前提是类的继承性
      • ② abstract不能用来修饰:属性、构造器等结构
      • ③ abstract不能用来修饰私有方法、静态方法、final的方法、final的类

  3、抽象类的匿名子类

    • 非匿名的类非匿名的对象

     技术图片

    • 非匿名的类匿名的对象

 技术图片

    • 创建匿名子类的非匿名对象

 技术图片

    • 创建匿名子类的匿名对象

 技术图片

  4、模板方法设计模式(TemplateMethod)

    • 抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类总体上会保留抽象类的行为方式
    • 解决的问题:

技术图片

 

以上是关于面向对象之接口与抽象性的主要内容,如果未能解决你的问题,请参考以下文章

Python全栈之路系列----之-----面向对象4接口与抽象,多继承与多态)

代码学习PHP面向对象之抽象类与接口

面向对象之多态

面向对象之多态

面向对象之接口

C++基础——C++面向对象之数据封装数据抽象与接口基础总结