• Java 抽象类和接口


    目录

    1️⃣什么是抽象类?

    注意事项

    抽象类的使用场景

    特征和注意事项

    final和abstract是什么关系?

    2️⃣接口的定义与特点

    接口的用法

    接口和接口的关系

    接口多继承的作用

    接口的注意事项

    3️⃣抽象类和接口区别

    4️⃣抽象类和接口的共同点


    1️⃣什么是抽象类?

    ​在Java中abstract是抽象的意思,可以修饰类、成员方法

    abstract修饰类,这个类就是抽象类;abstract修饰方法,这个方法就是抽象方法。

    注意事项

    • 抽象方法只有方法签名,不能声明方法体
    • 一个类中如果定义了抽象方法,这个类必须声明成抽象类,否则会报错。

    抽象类的使用场景

    • 抽象类可以理解成不完整的设计图,一般作为父类,让子类来继承
    • 当父类知道子类一定要完成某些行为,但是每个子类该行为的实现又不同,于是该父类就把该行为定义成抽象方法的形式,具体实现交给子类去完成。此时这个类就可以声明成抽象类。

    特征和注意事项

    1. 一个类只能继承一个抽象类
    2. 修饰符不能是private(因为要被继承)
    3. 类拥有的成员(如:成员变量、方法、构造器),抽象类也都具备
    4. 抽象类中不一定有抽象方法,但有抽象方法的类一定是抽象类
    5. 一个类继承了抽象类,就必须重写抽象类的全部抽象方法,否则这个类也必须定义成抽象类。
    6. 不能用abstract修饰变量、代码块、构造器
    7. 最重要的特征:抽象类虽然得到了抽象方法,但是失去了创建对象的能力 【即:不能用来实例化对象,所以抽象类必须被继承才能被使用,其他的功能和普通类相同】

    为什么抽象类不能创建对象呢?

    可以用反证法来验证,假设抽象类可以创建对象,但是在调用方法时就会报错,因为调用的方法连方法体都没有!因此抽象类不能创建对象

    final和abstract是什么关系?

    答案是互斥关系

    原因主要有以下两个方面:

    • abstract定义的抽象类作为模板让子类继承,final定义的类不能被继承
    • 抽象方法定义通用功能让子类重写,final定义的方法子类不能重写。

    2️⃣接口的定义与特点

    接口的格式如下:

    • JDK1.8之前接口中只能定义抽象方法常量,没有其他成分
    • 接口不能实例化
    • 接口是一种规范
    • 由于接口体现的是规范思想,规范默认都是公开的,所以接口中的成员都是public修饰的,也可以省略不写

    接口中的变量默认用public static final修饰

    接口中方法默认用public abstract修饰

    接口的用法

    接口是用来被实现(implements)的,实现接口的类称为实现类。实现类可以理解成所谓的子类。

    接口可以被类单实现,也可以被类多实现。

    接口和接口的关系

    类和类的关系:单继承。

    类和接口的关系:多实现。

    接口和接口的关系:多继承,一个接口可以同时继承多个接口。

    接口多继承的作用

    规范合并,整合多个接口为同一个接口,便于子类实现。

    即:在开发设计的过程中,一个类同时实现多个接口,看起来比较繁琐

    因此就有了如下设计:

    让一个接口A继承多个接口,然后再由类实现接口A就可以了

    接口的注意事项

    1.接口中所有的方法不能有具体的实现,即接口中的方法都是抽象方法。

    2.接口必须通过类来实现它的抽象方法

    3.接口不能创建对象

    4.一个类实现多个接口,多个接口中有同样的静态方法时不冲突

    【原因是:接口中的方法只能接口自己调用】

    5.一个类继承了父类,同时又实现了接口,当父类中和接口中有同名方法时,默认用父类的

    举个例子:

    1. public class text4 {
    2. public static void main(String[] args) {
    3. Cat cat=new Cat();
    4. cat.eat();
    5. }
    6. }
    7. class Animal{
    8. public void eat(){
    9. System.out.println("父类中的eat方法");
    10. }
    11. }
    12. interface Food{
    13. default void eat(){//使用default修饰的接口方法,可以拥有方法体,实现类不需要重写,可以被实现类继承,该特性是Java8以后被提出
    14. System.out.println("接口中的eat方法");
    15. }
    16. }
    17. class Cat extends Animal implements Food {
    18. }

    运行结果:

      

    3️⃣抽象类和接口区别

    从语法层面来说:

    1、抽象类可以提供成员方法的实现细节,而接口中只能存在抽象方法

    2、抽象类中成员变量可以是多种类型,接口中成员变量必须用public static final修饰

    3、一个类只能继承一个抽象类,但可以实现多个接口

    4、抽象类中允许含有静态代码块和静态方法,接口不能

    从设计层面而言:

    1.抽象类是对整一个类的属性,行为等方面进行抽象,而接口则是对行为抽象。就好比飞机和鸟,抽象类抽象出的是飞行物类。而接口则是抽闲出飞行方法。

    2.抽象类是一个模板式的设计,当在开发过程中出现需求更改的情况,只需要更改抽象类而不需要更改它的子类。

    接口是一种辐射性设计,当接口的内容发生改变时,需要同时对实现它的子类进行相应的修改。

    4️⃣抽象类和接口的共同点

    接口和抽象类又很像,它们都具有如下共同的特征

    • 接口和抽象类都不能被实例化,它们都位于继承树的顶端,用于被其他类实现和继承。
    • 接口和抽象类都可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法。

  • 相关阅读:
    灵活运用Vue指令:探究v-if和v-for的使用技巧和注意事项
    保存文件时电脑提示:你没有权限在此位置中保存文件。请与管理员联系以获得相应权限。
    Spring Boot 和 Spring Framework 的区别是什么?
    学习自动化测试该怎么学?
    论文阅读——Detection Hub(cvpr2023)
    liteos-M 编译链接问题记录及对应解决方案
    燕千云知识库,解决你的知识沉淀烦恼
    【项目管理】原则之四--聚焦于价值
    Java真的不难(四十九)Redis的入门及使用(2)
    【CGE】“双碳”目标下资源环境中的可计算一般均衡CGE模型应用
  • 原文地址:https://blog.csdn.net/qq_49129184/article/details/126199964