Java 抽象类与接口
原文参考:abstract class 和 interface 的区别(天极网,约 2004)。下文在保留原意的基础上整理格式;Java 8 起接口支持 default/static 方法,见 JDK 8 与文末说明。 概述 在 Java 中,abstract class 与 interface 都用于抽象类型定义,语法上相似,甚至有时可以互换,但二者在继承模型、默认行为与设计理念上差异明显。选型往往反映对问题领域与设计意图的理解是否到位。 快速对比 维度 抽象类 接口 继承 / 实现 extends,单继承 implements,可多实现 构造函数 可以有 不能有 实例字段 可以有 传统上仅 public static final 常量(一般不定义字段) 方法 可有抽象与非抽象方法 传统上方法均为 public abstract;Java 8+ 可有 default/static 访问修饰 方法可为任意修饰符 方法默认 public 设计理念 常表示 is-a(本质同一类事物) 常表示 like-a / 契约(具备某种能力) 理解抽象类 abstract class 与 interface 都用于定义「抽象体」——注意此处「抽象类」是面向对象概念,不等同于关键字 abstract class。 在面向对象中,并非所有类都对应可实例化的具体对象。若类中信息不足以描述一个具体对象,即为抽象类。它往往表征问题领域中的抽象概念,例如图形编辑软件里的「形状」:圆、三角形是具体概念,「形状」在问题域中不存在对应实体,故抽象类不可实例化。 抽象类主要用于类型隐藏:固定一组行为的抽象描述,具体实现由派生类完成。模块依赖稳定的抽象体,符合开闭原则(OCP)。 语法层面的差异 以名为 Demo 的类型为例: ...