抽象类和接口的区别以及使用场景

本文对比了抽象类和接口的特点及使用场景。介绍了两者在继承方式、实现数量、功能强调等方面的差异,以及它们各自适用的具体情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

抽象类和接口的区别以及使用场景(记)

1. 相同点

  1. 两者都是抽象类,都不能实例化。
  2. interface实现类及abstrct class的子类都必须要实现已经声明的抽象方法。

2. 不同点

  1. interface需要实现,要用implements,而abstract class需要继承,要用extends。

  2. 一个类可以实现多个interface,但一个类只能继承一个abstract class。

  3. interface强调特定功能的实现,而abstract class强调所属关系。

  4. 尽管interface实现类及abstrct class的子类都必须要实现相应的抽象方法,但实现的形式不同。interface中的每一个方法都是抽象方法,都只是声明的(declaration, 没有方法体),实现类必须要实现。而abstract class的子类可以有选择地实现:

    这个选择有两点含义:

    • Abastract class中并非所有的方法都是抽象的,只有那些冠有abstract的方法才是抽象的,子类必须实现。那些没有abstract的方法,在Abstrct class中必须定义方法体。
    • abstract class的子类在继承它时,对非抽象方法既可以直接继承,也可以覆盖;而对抽象方法,可以选择实现,也可以通过再次声明其方法为抽象的方式,无需实现,留给其子类来实现,但此类必须也声明为抽象类。既是抽象类,当然也不能实例化。
  5. abstract class是interface与Class的中介。
  6. interface是完全抽象的,只能声明方法,而且只能声明pulic的方法,不能声明private及protected的方法,不能定义方法体,也不能声明实例变量。然而,interface却可以声明常量变量,并且在JDK中不难找出这种例子。但将常量变量放在interface中违背了其作为接口的作用而存在的宗旨,也混淆了interface与类的不同价值。如果的确需要,可以将其放在相应的abstract class或Class中。 
    abstract class在interface及Class中起到了承上启下的作用。一方面,abstract class是抽象的,可以声明抽象方法,以规范子类必须实现的功能;另一方面,它又可以定义缺省的方法体,供子类直接使用或覆盖。另外,它还可以定义自己的实例变量,以供子类通过继承来使用。

3. interface的应用场合

  1. 类与类之前需要特定的接口进行协调,而不在乎其如何实现。
  2. 作为能够实现特定功能的标识存在,也可以是什么接口方法都没有的纯粹标识。
  3. 需要将一组类视为单一的类,而调用者只通过接口来与这组类发生联系。
  4. 需要实现特定的多项功能,而这些功能之间可能完全没有任何联系。

4. abstract class的应用场合

一句话,在既需要统一的接口,又需要实例变量或缺省的方法的情况下,就可以使用它。最常见的有:

  1. 定义了一组接口,但又不想强迫每个实现类都必须实现所有的接口。可以用abstract class定义一组方法体,甚至可以是空方法体,然后由子类选择自己所感兴趣的方法来覆盖。
  2. 某些场合下,只靠纯粹的接口不能满足类与类之间的协调,还必需类中表示状态的变量来区别不同的关系。abstract的中介作用可以很好地满足这一点。
  3. 规范了一组相互协调的方法,其中一些方法是共同的,与状态无关的,可以共享的,无需子类分别实现;而另一些方法却需要各个子类根据自己特定的状态来实现特定的功能
### Java 中抽象类接口的适用场景对比 #### 抽象类的特点及其适用场景 抽象类用于定义一组具有共同属性行为的对象。此类不允许被实例化,仅能作为其他类的基础[^1]。当多个子类共享大量相似的方法实现时,可以考虑使用抽象类。这不仅减少了重复代码量,还便于维护统一的行为模式。 对于那些希望提供部分默认功能而留给具体子类去完成特定细节的情况特别适合采用抽象类设计方式。例如,在图形处理应用中,如果存在多种形状(圆形、矩形等),它们都拥有绘制边界线这一共通操作,则可以在抽象基类Shape里给出drawOutline()的具体算法框架;至于填充颜色fillColor(), 则留待各派生类别自行决定如何执行[^4]。 ```java abstract class Shape { public void drawOutline(){ System.out.println("Drawing outline..."); } abstract public void fillColor(); } ``` #### 接口的作用及其实现环境的选择依据 相比之下,接口更侧重于描述对象能够做什么而不是怎样做。通过`interface`关键字声明的一组无参函数原型构成了该类型的契约——任何实现了此接口的实体均需遵照约定履行相应职责[^2]。因此,当关注点在于表达能力而非内部机制的时候,优先选用接口会更加合理。 另外值得注意的是,由于Java允许单个类同时实现多个不同的接口,所以在需要构建复杂角色模型或者模拟多重继承效果的情形下,利用接口往往能达到事半功倍的效果[^3]。比如在一个电子商务平台项目里,商品既可以是实物也可以是虚拟物品,此时就可以让Product类分别实现PhysicalItemDigitalContent两个独立却又互不干扰的接口。 ```java public interface PhysicalItem{ String getWeight(); } public interface DigitalContent{ int getFileSizeInMB(); } class Product implements PhysicalItem, DigitalContent{ ... } ``` 综上所述,选择抽象类还是接口取决于实际需求: - 如果目标是在保持灵活性的同时确保某些核心逻辑得到一致的应用,那么应该倾向于创建一个带有若干已知成员变量/方法签名加上至少一个纯虚函数的抽象父类; - 若仅仅是为了规定一系列服务条款而不涉及具体的业务流程控制,则推荐采纳由零个或更多常量字段搭配任意数量未加修饰符限定的方法组成的轻量化接口结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值