抽象类和接口的区别是什么?
一、核心本质不同抽象类是类代表「模板、事物的本质」描述一类事物共有的属性行为属于继承关系is-a例Animal是抽象类Dog is Animal接口行为规范、能力标准只定义功能契约不关心实现细节属于「具备某种能力has-a/can-do」例Run、Swim接口Dog can Run二、逐条详细对比1. 定义关键字抽象类abstract class 类名接口interface 接口名2. 继承/实现规则抽象类单继承一个类只能extends一个抽象类接口多实现一个类可以implements多个接口接口之间也可多继承extends 接口1,接口23. 构造方法抽象类有构造方法供子类super()初始化父类成员不能new抽象类本身接口没有构造方法完全不能实例化4. 成员变量抽象类可以定义普通成员变量、静态变量、常量修饰符不限private/protected/public/static/final均可abstractclassAnimal{privateStringname;protectedintage;publicstaticStringtype动物;finalStringkind生物;}接口变量默认强制public static final必须初始化不能修改只能是常量不能定义普通实例变量interfaceRun{intSPEED10;// 等价 public static final int SPEED 10;}5. 方法分类分JDK版本① JDK7及以前抽象类普通实例方法、抽象方法、static静态方法、私有方法接口只能有public抽象方法不能有带方法体的方法② JDK8 新增抽象类不变接口新增default默认方法有方法体实现类可重写可不重写static静态方法只能用接口名调用实现类继承不到③ JDK9 新增接口支持private私有方法供内部default/static复用代码访问修饰符抽象类方法可 private/protected/public/static接口抽象方法默认强制public不能写private/protected6. 能否包含静态代码块、实例代码块抽象类可以有静态代码块、实例代码块接口不能有实例代码块只能有静态代码块7. abstract final 限制抽象类不能加finalabstract要求被继承final禁止继承冲突接口隐式abstract不能用final修饰8. 使用场景抽象类多个子类存在共同属性、共同实现逻辑抽取公共代码例所有动物都有name、age都需要sleep()抽成抽象父类接口抽取扩展行为规范不同无关类可以拥有同一能力例人和狗都能跑步人、汽车都能鸣笛用接口定义Run、Sound三、汇总对比表对比项abstract 抽象类interface 接口关系is-a 继承单继承can-do 能力多实现构造器有构造方法无构造方法成员变量普通变量、常量、静态变量均可只能 public static final 常量实例字段支持不支持抽象方法可任意权限只能 public带体方法普通实例方法、static、privateJDK8:default、staticJDK9:private代码块实例块、静态块都有仅静态代码块继承数量一个类只能继承一个一个类可实现多个接口多继承实例化不能直接new靠子类多态不能直接new靠实现类多态设计目的抽取一类事物公共模板定义通用行为规范四、高频面试问答抽象类和接口哪个执行速度快抽象类更快接口需要额外查找实现类方法表。什么时候用抽象类什么时候用接口多个类有大量共用属性和代码→ 抽象类只定义行为标准、无关类共享同一功能 → 接口一个类继承抽象类同时实现多个接口可以吗可以class Dog extends Animal implements Run, Swim{}接口的static方法能被实现类调用吗不能只能接口名.静态方法()调用。default方法冲突怎么办一个类实现多个接口多个接口有同名同参default方法实现类必须手动重写该方法。