抽象类(或类型)是程序声明的标称类型系统中的一种类型。尽管名称暗示了这种含义,但是抽象类可能包含也可能不包含抽象方法或属性。区分类是指可用于实现抽象类型的不同语言构造。抽象类的特点是设计问题与最佳的面向对象编程保持一致,并且它们的未完成性质也是如此。
接口是类必须实现以指定接口(通常而言)的抽象类型。接口只能包含方法签名和常量声明(静态和最终声明),而不能包含方法定义。接口模拟多个继承,并用于编码各种类型的类之间共享的相似性。
可以用几种不同的方式来创建,表示或模拟抽象类型。程序员可以通过显式使用关键字abstract
来表示抽象类型,方法是在类定义中包括一个或多个方法,从另一个抽象类型继承而不覆盖完成类定义所必需的缺少功能,或者通过将特定方法发送给面向对象不能直接实现该方法的编程语言。
可以使用抽象方法定义接口。类也可以在接口中实现。如果一个类确实实现了一个接口并且未实现其所有方法,则必须使用符号抽象,否则就不需要符号(因为所有接口本质上都是抽象的)。类还可以实现多个接口。
虽然接口用于指定通用接口,但是抽象类型可以用于定义和执行协议(这是实现所需协议的所有对象都必须支持的一组操作)。没有子类型的语言不会出现抽象类型。这样,子类型被迫实现所有必需的功能,从而确保程序执行的正确性。可以通过多种方式创建抽象类型:完整的抽象基类是明确声明为抽象或包含抽象(未实现)方法的类。常见的Lisp对象系统包括基于Flavors系统的mixin。 Java的Traits
,它是Smalltalk的扩展。
但是,下面给出的抽象类和接口之间有许多区别(以Java语言为例):
抽象类 | 接口 |
---|---|
抽象类可以具有抽象和非抽象方法。 | 接口只能具有抽象方法。 从Java 8开始,它还可以具有默认方法和静态方法。 |
抽象类不支持多重继承。 | 接口支持多重继承。 |
抽象类可以具有final ,非final ,static 和非static 变量。 |
接口只有static 变量和final 变量。 |
抽象类可以提供接口的实现。 | 接口无法提供抽象类的实现。 |
abstract 关键字用于声明抽象类。 |
interface 关键字用于声明接口。 |
抽象类可以扩展另一个Java类并实现多个Java接口。 | 一个接口只能扩展另一个Java接口。 |
可以使用关键字extends 扩展抽象类。 |
使用关键字implements 来实现接口。 |
Java抽象类可以具有类成员,例如private ,protected 等。 |
默认情况下,Java接口的成员是公共的。 |
我们来看下面一个简单的示例,同时使用接口和抽象类。
//Creating interface that has 4 methods
interface A{
void a();//bydefault, public and abstract
void b();
void c();
void d();
}
//Creating abstract class that provides the implementation of one method of A interface
abstract class B implements A{
public void c(){System.out.println("I am C");}
}
//Creating subclass of abstract class, now we need to provide the implementation of rest of the methods
class M extends B{
public void a(){System.out.println("I am a");}
public void b(){System.out.println("I am b");}
public void d(){System.out.println("I am d");}
}
//Creating a test class that calls the methods of A interface
class Test5{
public static void main(String args[]){
A a=new M();
a.a();
a.b();
a.c();
a.d();
}
}
总结
- 抽象类(或类型)声明程序;接口是所有类都必须实现以指定其接口的抽象类型。
- 抽象类型可以使用关键字显式表示;接口本质上是抽象的,因此根本不需要使用关键字来表示(除非特定类实现了接口,但未实现其所有方法)。
欢迎任何形式的转载,但请务必注明出处,尊重他人劳动成果。
转载请注明:文章转载自 有区别网 [http://www.vsdiffer.com]
本文标题:抽象类和接口
本文链接:https://www.vsdiffer.com/vs/abstract-class-vs-interface.html
免责声明:以上内容仅是站长个人看法、理解、学习笔记、总结和研究收藏。不保证其正确性,因使用而带来的风险与本站无关!如本网站内容冒犯了您的权益,请联系站长,邮箱: ,我们核实并会尽快处理。