抽象类(abstract class)和接口(Interface)的区别
抽象类(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来实现接口。它需要提供接口中所有声明的方法的实现 |
作用 | 了把相同的东西提取出来,即重用 | 为了把程序模块进行固化的契约,是为了降低偶合 |
总结
本文对抽象类(abstract class)和接口(Interface)进行了简单的总结,有兴趣可以继续关注Carson_Ho的安卓开发笔记,不定期分享关于安卓开发的干货
抽象类(abstract class)和接口(Interface)的区别相关推荐
- Java抽象类(Abstract Class)与接口(Interface)区别
抽象类与接口比较 抽象类跟接口类似,都不能实例化,可能包含不需实现方法或已实现的方法. 抽象类可以定义一些不是静态或常量的字段,定义 public, protected, private访问级别的具体 ...
- php中的抽象类(abstract class)和接口(interface)
一. 抽象类abstract class 1 .抽象类是指在 class 前加了 abstract 关键字且存在抽象方法(在类方法 function 关键字前加了 abstract 关键字)的类. 2 ...
- JAVA的abstract修饰符 接口interface用法 抽象类和interface的差别
转自:http://blog.csdn.net/zhandoushi1982/article/details/8458081 abstract修饰符可以修饰类和方法. (1)abstract修饰类,会 ...
- abstract类和接口interface的联系和区别
一,用关键字abstract类修饰的类称为abstract类(抽象类). abstract class A{ ----. } 特点: 1. 抽象类中可以有抽象方法和非抽象方法,但是抽象方法只允许声明不 ...
- java 抽象接口类,Java接口(interface)和Java抽象类(abstract class)的区别(详诉版)
1.概述 一个软件设计的好坏,我想很大程度上取决于它的整体架构,而这个整体架构其实就是你对整个宏观商业业务的抽象框架, 当代表业务逻辑的高层抽象层结构合理时,你底层的具体实现需要考虑的就仅仅是一些算法 ...
- 接口Interface和抽象类abstract class的区别
abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力. abstract class和inte ...
- C#中接口(Interface)与抽象类(abstract)的区别
前言:在我学习接口(interface)与抽象类(abstract)时,我发现它们有一些相似之处也有一些不同,本博文来详细说说它们二者之间的区别: 文章目录: 一.不同之处: 1.声明上: 2.成员上 ...
- php 类 接口的区别吗,PHP的接口类(interface)和抽象类(abstract)的区别
/** * 接口类:interface * 其实他们的作用很简单,当有很多人一起开发一个项目时,可能都会去调用别人写的一些类, * 那你就会问,我怎么知道他的某个功能的实现方法是怎么命名的呢,这个时候 ...
- 小论接口(interface)和抽象类(abstract class)的区别
接口是类实现了某一种功能的体现,这种体现往往是对外的,所以重载接口的函数一定是public的 可是初学OO编程的时候,往往会碰到一个问题,既然有接口(interface)的存在,为什么还要有抽象类(a ...
- 零基础入门 自学 JAVA SE 基础篇(九)instanceof final 开闭原则 多态 抽象(abstract)方法与抽象类 接口(interface)
JAVA SE自学 基础篇 多态 instanceof final 开闭原则 多态 抽象(abstract)方法与抽象类 接口(interface) 目标 父类型与子类型之间的转换及instanceo ...
最新文章
- Linux pip安装包。解决:You should consider upgrading via the 'pip install --upgrade pip' command.
- php 安装rabbitmq拓展_【RabbitMQ】——centos7安装rabbitmq教程 以及 PHP开启rabbitmq扩展...
- Shell中的数据重定向--输入/输出重定向
- hadoop fs默认操作路径
- Java注释--单行注释、多行注释、文档注释
- python向上取整 向下取整
- python logging模块使用教程
- mysql 事件计划_mysql 事件计划
- oracle库存会计期无法打开,打开调整会计期出错!(有图)
- python动态获取cookie_看到很多人求助python 我也求助一下如何写cookie的获取和登录吧...
- sim800c GPRS模块的透传模式
- python名片管理系统_Python名片管理系统
- 解除诺顿企业版的 liveupdate 旁边小锁,解除限制 手动 更新诺顿的方法
- 台式计算机蓝牙完成配对,电脑蓝牙已配对但连不上 带你快速解决一下
- 【最全】应用程序无法正常启动0xc000007b,解决方案
- 外贸常用术语_2017常用外贸术语大全
- 将Unity地形以Wavefront Obj格式导出
- 苹果自带地图定位 经纬度
- PLC控制系统的接地设计
- mysql charset=utf-8_mysql数据库charset=utf-8
热门文章
- istringstream和ostringstream
- vscode 运行html服务器运行_如何在vscode中调用浏览器运行html?
- 字符编码在python中的处理与储存_python----字符编码与文件处理
- java基础笔试_java基础笔试题
- WSL安装Oracle,WSL安装JDK8 - terwergreen的个人空间 - OSCHINA - 中文开源技术交流社区...
- win10上安装opencv详细教程
- 安装MindStudio
- opencv 仪表数字切割
- tensorboard 远程
- vue里面怎么删除部分页面_基于VUE选择上传图片并页面显示(图片可删除)