Java中的抽象类和接口


抽象类

一、抽象类的概述

引入:

    父类知道子类一定要完成某个功能,但是每个子类实现的情况都不一样
    而且子类都会用自己的功能了,父类的该功能就可以定义成抽象的方法。
    拥有抽象方法的类必须定义成抽象类。

什么是抽象方法?

没有方法体,只有方法签名,必须用abstract修饰的方法就是抽象方法。

什么是抽象类?

拥有抽象方法的类必须定义成抽象类。
抽象类必须用abstract关键字修饰。

小结:

      抽象方法:没有方法体,只有方法签名,必须用abstract修饰的方法就是抽象方法。
    抽象类:拥有抽象方法的类必须定义成抽象类,必须用abstract修饰。

二、抽象类的使用

抽象类是为了被继承

总结:

    一个类继承了抽象类,必须重写完抽象类的全部抽象方法,否则这个类必须定义成抽象类。
    因为拥有抽象方法的类必须定义成抽象类。

三、抽象类的特征研究和深入

抽象类的特征:有得有失。

    有得:抽象类拥有了得到抽象方法的能力。
    失去:抽象类失去了创建对象的能力。

面试题:抽象类是否有构造器,是否可以创建对象,为什么?

答:抽象类作为类一定有构造器,而且必须有构造器。
提供给子类继承后调用父类构造器使用的。

抽象类虽然有构造器,但是抽象类绝对不能创建对象。
抽象类中可能存在抽象方法,抽象方法不能执行。
抽象在学术上本身意味着不能实例化。

抽象类除了有得有失之外,类的其他成分人家都具备!!

小结:

    抽象类不能创建对象。
    抽象类除了不能创建对象之外,类的其他成分它都具备!
    抽象类中也可以没有抽象方法!!

四、抽象类的意义

抽象类存在的意义有两点:

  • 被继承,抽象类就是为了被子类继承,否则抽象类将毫无意义。(核心意义)
  • 抽象类体现的是"模板思想":部分实现,部分抽象。(拓展)
    • 可以使用抽象类设计一个模板模式。

五、抽象类设计模板模式

设计模式

是前人(技术大牛,或者一些技术协会,或者一些大型知名的IT公司)
已经研发好或者设计好或者在实战开发中发现的的优秀软件设计思想,开源出去
后来者可以直接使用就能够得到很好的软件模式。

设计模式的目的

得到优秀的软件架构,从而提升代码的可重用性,扩展性,维护性,可读性。

模板模式的作用

部分实现,部分抽象,可以极大的简化功能代码,提高开发效率

小结:

    抽象类是部分实现,部分抽象的含义,所以可以设计模板模式。
    好处:模板可以确定的模板自己实现,模板不能确定的定义成抽象方法交给使用模板的人重写。
    可以设计出优秀的设计模式,提升开发效率,提高代码的重用性!

七、抽象类的注意事项和总结

  • 抽象类不能创建对象,如果创建,编译无法通过而报错。只能创建其非抽象子类的对象。

理解:假设创建了抽象类的对象,调用抽象的方法,而抽象方法没有具体的方法体,没有意义。

  • 抽象类一定有而且是必须有构造器,是供子类创建对象时,初始化父类成员使用的。

理解:子类的构造器中,有默认的super(),需要访问父类构造器。

  • 抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
  • 抽象类的子类,必须重写抽象父类中所有的抽象方法,否则子类也必须定义成抽象类。
  • 抽象类存在的意义是为了被子类继承,抽象类体现的是模板思想。

理解:抽象类中已经实现的是模板中确定的成员,
抽象类不确定如何实现的定义成抽象方法,交给具体的子类去实现。

接口

一、接口的概述

什么是接口?

接口是更加彻底的抽象,接口中全部是抽象方法和常量,没有其他成分。(JDK 1.8之前)

接口有啥用?

接口体现的是规范思想,实现接口的类必须重写完接口中全部的抽象方法。
规范 == 约束。
接口称为被实现,实现接口的类称为实现类。

定义接口的格式:

修饰符 interface 接口名称{
          }

interface:定义接口的关键字。

接口中的成分研究(JDK 1.8之前)

  • 抽象方法
    • 接口中的抽象方法默认会加上public abstract修饰,所以可以省略不写。
  • 常量
    • 常量:是指有public static final修饰的成员变量,有且仅能被赋值一次,值不能改变。
    • 常量的名称规范上要求全部大写,多个单词下划线连接。
    • 常量修饰的public static final 可以省略不写,默认会加上。

小结:

      定义接口使用的关键字:interface
      接口中的成分在JDK 1.8之前只能有:常量和抽象方法。
      在接口中常量的修饰符:public static final 可以省略不写,默认会加上。
      在接口中抽象方法的修饰符:public abstract 可以省略不写,默认会加上。

二、接口的基本实现

引入

    类与类是继承关系:一个类只能直接继承一个父类。
    类与接口是实现关系:一个类可以实现多个接口。
    实现接口的类称为“实现类”。

    子类   继承   父类
    实现类 实现   接口

实现类实现接口的格式

    修饰符 class 实现类名称 implements 接口1,接口2,接口3,....{

    }

implements:实现的含义。
接口是可以被多实现的:一个类可以实现多个接口。

小结:

    接口是用类被实现的,实现接口的类称为实现类。
    实现接口的关键字是:implements。
    接口是可以被类多实现的。
    注意:一个类实现接口必须重写完接口中全部抽象方法,否则这个类必须定义成抽象类!!

三、接口的多实现介绍

实现类实现接口的格式:

     修饰符 class 实现类名称 implements 接口1,接口2,接口3,....{

     }

类与类是单继承。
类与接口是多实现。

小结:

    一个类可以实现多个接口。
    一个类如果实现了多个接口,必须重写完全部接口中的全部抽象方法
    否则这个类必须定义抽象类。

四、接口与接口的多继承

引入:

    类与类是单继承关系:一个类只能继承一个直接父类。
    类与接口是多实现关系:一个类可以实现多个接口。
    接口与接口是多继承关系:一个接口可以继承多个接口。

五、JDK 1.8开始之后接口新增的三种方法

引入:

  • JDK 1.8之前接口中只能是抽象方法,常量。
  • JDK 1.8开始之后接口不再纯洁了。
  • JDK 1.8开始之后接口新增了如下三种方法。

a.默认方法(就是之前写的普通实例方法)

  • 必须用default修饰,默认会public修饰
  • 必须用接口的实现类的对象来调用。

b.静态方法

  • 默认会public修饰
  • 注意:接口的静态方法必须用接口的类名本身来调用。

c.私有方法(就是私有的实例方法): JDK 1.9才开始有的。

  • 只能在本类中被其他的默认方法或者私有方法访问。

六、实现多个接口的使用注意实现

  • 如果实现了多个接口,多个接口中存在同名的静态方法并不会冲突,
    原因是只能通过各自接口名访问静态方法。

  • 当一个类,既继承一个父类,又实现若干个接口时,(重点)
    父类中的成员方法与接口中的默认方法重名,子类就近选择执行父类的成员方法。、

  • 当一个类实现多个接口时,多个接口中存在同名的默认方法。
    实现类必须重写这个方法。

  • 接口中,没有构造器,不能创建对象。(重点)
    接口是更彻底的抽象,连构造器都没有,自然不能创建对象!!