抽象类(abstract class)和接口(Interface)的区别

简介: 还在等什么,快来一起讨论关注吧,公众号【八点半技术站】,欢迎加入社群

前言

  • 抽象类(abstract class)和接口(Interface)是Java语言中对于抽象类定义进行支持的两种机制,赋予了Java强大的面向对象能力。
  • 二者具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于abstractclass和Interface的选择显得比较随意。其实,两者之间还是有很大的区别的。
  • 本文将对它们之间的区别进行剖析,并提供一个在二者之间进行选择的依据。

抽象类是什么?

本文中的抽象类表示的是一个抽象体,并非直接从abstract class翻译而来,而abstract class仅仅是Java语言中用于定义抽象类的一种方法,请读者注意区分)

  • 在面向对象的概念中,所有的对象都是通过类来描绘的,但是并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
  • 抽象类的定义
    是对一系列看上去不同,但是本质上相同的具体概念的抽象,往往用来表征我们在对问题进行分析、设计中得出的抽象概念
  • 比如:如果我们进行一个图形编辑软件的开发,就会发现问题领域存在着圆、三角形这样一些具体概念,它们是不同的,但是它们本质上又都属于这样一个概念:形状,形状这个概念在问题领域是不存在的,所以形状就是一个圆形、三角形的抽象类。
  • 正是因为抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能实例化的。

为什么要有抽象类?

  • 用于类型隐藏
    在面向对象领域,抽象类主要用来进行类型隐藏。我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类。
  • 用于拓展对象的行为功能
    这一组任意个可能的具体实现则表现为所有可能的派生类(子类),模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。

如何进行抽象类的定义?

抽象类(abstract class)和接口(Interface)在Java语言中都是用来进行抽象类定义的两种主要方法

抽象类(abstract class)

  • 定义:包含抽象方法的的类是abstract class

用abstract关键字修饰

  • 作用:abstractclass是为了把相同的东西提取出来,即重用
  • 使用abstractclass语法规定
语法 备注
抽象类定义用abstract关键字修饰 要通过子类进行实例化
抽象类是不能被实例化的 要通过子类进行实例化
子类必须重写父类的所有抽象方法 抽象方法:声明但却未被实现的方法,用abstract关键字修饰
含有抽象方法的类一定是抽象类,但是抽象类不一定含有抽象方法
抽象类是用来被它的子类继承的 关键字extends
抽象类是在功能上的一个规定

Interface

  • 定义:比abstract class更加抽象,是一种特殊的abstract class

用Interface关键字修饰

  • 作用:Interface是为了把程序模块进行固化的契约,是为了降低偶合
  • 使用Interface的语法规定
语法 备注
接口定义用Interface关键字修饰
接口中的所有方法都是抽象的 可以用abstract修饰,也可以省略
接口中的方法必须是用public修饰,或不写 但是不能被其他修饰符修饰
接口中的属性必须是全局常量 publicstaticfinal修饰
抽象类是用来被它的子类实现的 关键字Implements
抽象类是在结构上的一个规定
接口不能被实例化
子类实现接口时需要实现接口中的所有方法 若有一个未不实现,该子类就是抽象类abstractclass

实例

下面以定义一个名为Demo的抽象类为例来说明这种不同。

  • 使用abstract class的方式定义Demo抽象类:
abstract classDemo{
abstract void method1();
abstract avoid method2();}
  • 使用interface的方式定义Demo抽象类:
interface Demo{
void method1();
void method2();}

二者的相同点

都不能被实例化

二者的区别

类型 abstract class Interface
定义 abstract class关键字 Interface关键字
继承 抽象类可以继承一个类和实现多个接口;子类只可以继承一个抽象类 接口只可以继承接口(一个或多个);子类可以实现多个接口
访问修饰符 抽象方法可以有public、protected和default这些修饰符 接口方法默认修饰符是public。你不可以使用其它修饰符
方法实现 可定义构造方法,可以有抽象方法和具体方法 接口完全是抽象的,没构造方法,且方法都是抽象的,不存在方法的实现
实现方式 子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现 子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现
作用 了把相同的东西提取出来,即重用 为了把程序模块进行固化的契约,是为了降低偶合


相关文章
|
10月前
|
Java
JAVA 抽象类(Abstract Class) 和 接口(Interface) 的区别
对于面向对象编程来说,抽象是它的一大特征之一。在 Java 中,可以通过两种形式来体现 OOP 的抽象:接口和抽象类。这两者有太多相似的地方,又有太多不同的地方。今天我们就一起来学习一下Java中的接口和抽象类抽象类不能用于实例化对象,抽象类往往用来表示抽象概念。举个例子,中国人(Chinese 类)和美国人(American 类)都有“吃饭”这个行为,因此可以先定义一个 Person 类,然后让 Chinese 和 American 都继承这个类。但如何在父类 Person 中定义“吃饭”这个方法呢?一般
106 0
抽象类和接口(Abstract and Interface)精湛细节
抽象类和接口(Abstract and Interface)精湛细节
abstract class和interface有什么区别?
声明方法的存在而不去实现它的类被叫做抽象类(abstract class)
91 0
【Java】抽象类(abstract)、接口(interface)
【Java】抽象类(abstract)、接口(interface)
|
Java
Java - abstract(抽象类)& interface(接口)
Java - abstract(抽象类)& interface(接口)
113 0
Java - abstract(抽象类)& interface(接口)
|
Java
接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类?抽象类中是否可以有静态的main方法?
有一个面试四连击的题目:接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类?抽象类中是否可以有静态的main方法?
153 0
接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类?抽象类中是否可以有静态的main方法?
接口是否可继承(extends)接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concrete class)?
接口可以继承接口,而且支持多重继承。抽象类可以实现(implements)接口,抽象类可继承具体类也可以继承抽象类。
1914 0
|
Android开发
Anonymous Inner Class(匿名内部类)是否可以继承其它类?是否可以实现接口?
可以继承其他类或实现其他接口,在Swing编程和Android开发中常用此方式来实现事件监听和回调。
1248 0
JAVA之旅(七)——final关键字 , 抽象类abstract,模板方法模式,接口interface,implements,特点,扩展
JAVA之旅(七)——final关键字 , 抽象类abstract,模板方法模式,接口interface,implements,特点,扩展 一.final 我们来聊聊final这个关键字 final可以修饰类,方法和变量 final修饰的类不可以被继承 final修饰的方法不可以被覆盖 fi.
1231 0