abstract class 和 interface 的区别
在 Java 语言中,abstract class 和 interface 是支持抽象类定义的两种机制。 正是由于这两种机制的存在,才赋予了 Java 强大的面向对象能力。abstract class 和 interface 之间在对于抽象类定义的支持方面具有很大的相似性,甚至 可以相互替换,因此很多开发者在进行抽象类定义时对于 abstract class 和 interface 的选择显得比较随意。其实,两者之间还是有很大的区别的,对于它 们的选择甚至反映出对于
问题领域本质的理解、对于设计意图的理解是否正确、 合理。 Abstract class 实例 化 不能 Interface 不能
一种继承关系,一个类只能使用 类 一次继承关系。可以通过继承多 一个类可以实现多个 interface 个接口实现多重继承 静态的不能被修改即必须是 static 数据 可有自己的 final,一般不在此定义 成员 可以私有的,非 abstract 方法,不可有私有的, 默认是 public, abstract 方法 类型 必须实现 可有私有的,默认是 friendly 不可有私有的,默认是 public static 变量 型, 其值可以在子类中重新定义, final 型,且必须给其初值,实现类中不 也可以重新赋值 能重新定义,不能改变其值。
设计 表示的是“is-a”关系 表示的是“like-a”关系 理念 实现 需要继承,要用 extends 要用 implements abstract class 和 interface 在
Java 语言中都是用来进行抽象类(本文中的抽 象类并非从 abstract class 翻译而来,它表示的是一个抽象体,而 abstract class 为 Java 语言中用于定义抽象类的一种方法)定义的,那么什么是抽象类, 使用抽象类能为我们带来什么好处呢? 声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要 创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类 的情况。不能创建 abstract 类的实例。然而可以创建一个变量,其类型是一个 抽象类, 并让它指向具体子类的一个实例。 不能有抽象构造函数或抽象静态方法。 Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象 类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这 些方法。
接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承 性可通过实现 这样的接口而获得。接口中的所有方法都是抽象的,没有一个有
程序体。接口只可以定义 static final 成员变量。接口的实现与子类相似,除 了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程 序体给予)所有这种接口的方法。 然后,它可以在实现了该接口的类的任何对 象上调用接口的方法。由于有抽象类,它允许
使用接口名作为引用变量的类型。 通常的动态联编将生效。引用可以转换到 接口类型或从接口类型转换, instanceof 运算符可以用来决定某对象的类是否实现了接口。 接口可以继承接口。抽象类可以实现(implements)接口,抽象类是可以继承实体 类,但前提是实体类必须有明确的构造函数。接口更关注“能实现什么功能”, 而不管“怎么实现的”。 1.相同点 1.相同点 A. 两者都是抽象类,都不能实例化。 B. interface 实现类及 abstrct class 的子类都必须要实现已经声明的抽象 方法。 2. 不同点 A. interface 需要实现,要用 implements,而 abstract class 需要继承,要 用 extends。 B. 一个类可以实现多个 interface,但一个类只能继承一个 abstract class。 C. interface 强调特定功能的实现,而 abstract class 强调所属关系。 D. 尽管 interface 实现类及 abstrct class 的子类都必须要实现相应的抽象 方法,但实现的形式不同。interface 中的每一个方法都是抽象方法,都只是声 明的 (declaration, 没有方法体),实现类必须要实现。而 abstract class 的 子类可以有选择地实现。 这个选择有