接口与抽象类的区别
OOP 中,核心是 封装
、继承
和 多态
,而在 继承
中,常常关联的是 接口
和 抽象类
,经常用倒是不假,但是使用语言组织描述一下,有可能就会卡壳,而这些是基础,基础的掌握程度决定了大厦的高度,因此,经常重新梳理一下 封装
中常用的 接口
和 抽象类
。
老规矩,想学什么东西,第一件事就是要了解 是什么,如果概念不清,就相当于开车路线不清楚,在路上瞎开,有时候,不一定能开到期望的终点。
1. 基础概念
1.1 接口
接口(英语:Interface),在Java编程语言中是一个抽象类型(Abstract Type),它被用来要求类(Class) 必须实现指定的方法,使不同类的对象可以利用相同的界面进行沟通。接口通常以 interface 来宣告,它仅能包含方法签名(Method Signature)以及常量宣告(变量宣告包含了 static 及 final),一个接口不会包含方法的实现(仅有定义)。
接口
的特点:
- 接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须宣告为抽象类(Abstract Class)
- 在Java中,接口类型可用来宣告一个变量,他们可以成为一个空指针,或是被绑定在一个以此接口实现的对象
- 其中一个使用接口的优势是,可以利用他们模拟多重继承,类在JAVA中不允许多重继承,所有在JAVA中的类必须而且仅能有一个父类,而java.lang.Object(JAVA类型系统中最顶层的类型)是唯一一个例外
- JAVA的类可以被实现许多个接口,然而一个接口则无法实现其他的接口
知道 接口
是什么,以及其特点以后,我们能用 接口
做什么呢?
开发中,可以使用 接口
用来统一类的共通行为,当不同的类需要进行信息共享时,是不需要特别去创建类间的关系。
举个 🌰:
一个人(Human)及一只鹦鹉(Parrot)都会吹口哨(whistle),然而 Human 及 Parrot 不应该为 Whistler 的子类,最好的做法是令他们为 Animal 的子类,而他们可以使用 Whistler 的接口进行沟通。其中 Whistler 就可以是一个 接口
,规约了 whistle 功能。
1.2 抽象类
介绍 抽象
类之前,先简单介绍下 不抽象 的 类
。
类(英语:class)在面向对象编程中是一种面向对象计算机编程语言的构造,是创建对象的蓝图,描述了所创建的对象共同的属性和方法。
类的更严格的定义是由某种特定的元数据所组成的内聚的包。它描述了一些对象的行为规则,而这些对象就被称为该类的实例。
简单来讲,类
就是对 属性
和 方法
的封装。使用伪码举个 🌰 :
class 人 {
属性:身高
属性:性别
属性:肤色
方法:学习() {
输出:比如正在看这篇文章的你正在学习
}
方法:跑步() {
}
// ...
}
结合上面简单的伪码,就能简单的理解 类
了,你可以尝试举一反三。
接下来,进入正题,介绍介绍 抽象类
。
抽象类:被定义为永远不会也不能被实例化为具体的对象。它往往用于定义一种抽象上的概念,在类的继承关系中它往往被定义在较上层的位置。
敲黑板!敲黑板!敲黑板!
永远不会也不能被实例化为具体的对象,这是重点,圈起来要考。
既然不能被实例化,那么它的作用是什么呢,请往后看:定义一种抽象上的概念,这就是 抽象类
的核心目的。是一个 概念,而不是具体的实现。
2. 抽象类
和 接口
对比分析
相同点 | 不同点 | |
---|---|---|
接口 | 1. 对共同的属性进行规约; 2. 对共同的方法进行规约; 3. 是不完整的类; 4. 接口可以看做是一个特殊的抽象类; |
不能包含对共同方法和属性的提供实现 |
抽象类 | 同上 | 可以规约一个共同的方法和属性时提供一个对他们的实现 |
最后,再次送上一个 🌰:“水果”可以算作一个抽象类,而“苹果”、“香蕉”则可以作为它的派生类。区别在于,“水果”是个概念,它不会有实例,但是“苹果”、“香蕉”则肯定会有实例。