先给大家说下基本概念

在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进 行抽象类定义时对于abstract class和interface的选择显得比较随意。其实,两者之间还是有很大的区别的,对于它们的选择甚至反映出对 于问题领域本质的理解、对于设计意图的理解是否正确、合理。

  abstract class和interface在Java语言中都是用来进行抽象类(本文 中的抽象类并非从abstract class翻译而来,它表示的是一个抽象体,而abstract class为Java语言中用于定义抽象类的一种方法, 请读者注意区分)定义的,那么什么是抽象类,使用抽象类能为我们带来什么好处呢?

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

java开发里面经常会用到虚函数和接口,这两者的区别是什么呢?

abstract: 子类里面只能继承一个父类

interface: 子类可以实现多个接口

那什么时候用abstract,什么时候用interface呢?

当某个子类和父类是 is a关系时,比如一个亚洲人是一个人,那么一个亚洲人的子类可以继承一个人的父类。
当子类和父类是like a关系时,比如一个美洲超人像一个超人,超人的能力不是每个人都有的,所以不是所有人的属性,我们不能把超能力归于人的父类,这时就可以用interface

代码例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public abstract class Man {
public abstract void eat();
public interface SuperPower {
public void superPower();
}
public class AsiaMan extends Man { 
@Override
public void eat() {
System.out.println( "亚洲人用筷子吃" );
}
public class AmericanSuperMan extends Man implements SuperPower {
public void superPower() {
System.out.println( "美国超人会飞" );
}
@Override
public void eat() {
System.out.println( "美国人用刀叉吃" );
}
}
public static void main(String[] args) {
Man anAsiaMan = new AsiaMan();
AmericanSuperMan anAmericanSuperMan = new AmericanSuperMan();
anAsiaMan.eat();
anAmericanSuperMan.eat(); 
anAmericanSuperMan.superPower();
}

运行结果:

美国人用刀叉吃
美国超人会飞
亚洲人用筷子吃

正确的使用abstract和interface有利提高代码可读性,当人们看到extend时就会知道这是一个is a什么,看到implement时可以知道这个类有什么特性like a

abstract 和 interface的区别详解相关推荐

  1. [ASP.NET]ASP.NET中的Inherits、CodeFile、CodeBehind的区别详解及OWIN及IDENTITY

    篇一 : ASP.NET中的Inherits.CodeFile.CodeBehind的区别详解 Inherits.CodeFile.CodeBehind 在 ASP.NET 中使用代码隐藏方法来设计W ...

  2. HashTable和HashMap的区别详解

    HashTable和HashMap的区别详解 一.HashMap简介 HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同 ...

  3. java mod %区别_Java中 % 与Math.floorMod() 区别详解

    %为取余(rem),Math.floorMod()为取模(mod) 取余取模有什么区别呢? 对于整型数a,b来说,取模运算或者取余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余 ...

  4. 关于numpy中eye和identity的区别详解

    https://www.jb51.net/article/175386.htm np.identity(n, dtype=None) np.eye(N, M=None, k=0, dtype=< ...

  5. php为什么需要配置路由器,laravel 配置路由 api和web定义的路由的区别详解

    1.路由经过中间件方面不同 打开kerenl.php就可以看到区别 protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware ...

  6. python协程详解_对Python协程之异步同步的区别详解

    一下代码通过协程.多线程.多进程的方式,运行代码展示异步与同步的区别. import gevent import threading import multiprocessing # 这里展示同步和异 ...

  7. Jar/War/Ear等包的作用与区别详解

    Jar/War/Ear等包的作用与区别详解 以客户角度来看,jar文件就是一种封装格式,用户不需要知道jar包中有多少个.class格式的文件及每个文件中的功能与作用,也可以得到相应的访问的结果.ja ...

  8. Java中print、printf、println的区别 详解

    Java中print.printf.println的区别详解 printf主要是继承了C语言的printf的一些特性,可以进行格式化输出 print就是一般的标准输出,但是不换行 println和pr ...

  9. axios请求接口http_使用axios请求接口,几种content-type的区别详解

    axios的使用 安装(一般使用框架的话, 脚手架都集成了) $ npm install axios 请求示例 // POST axios.post('/user', { firstName: 'Fr ...

最新文章

  1. Python字典排序sorted无效,用匿名函数lambda解决
  2. MSP430单片机输入与输出
  3. c#开发中程序集调用时容易忽略的问题
  4. Nature封面:大团队日趋中庸,小团队更容易出颠覆性创新
  5. mysql1000w数据怎么加索引_给mysql一百万条数据的表添加索引
  6. JS 对象转化为数组
  7. glEnable/glDisable(GL_CULL_FACE)与glCullFace()
  8. 楚留香服务器维护时间,2019年06月28日官方维护公告
  9. DOM之节点操作总结(附实例、图解)
  10. 字符串常量池(StringTable)总结
  11. 分组交换(Packet Switching)和线路交换(Circuit Switching)
  12. java blob 保存文件_java将文件保存为二进制流到oracle表中的blob字段 | 学步园
  13. 5 位改变世界的女性程序员
  14. 计算机网络-cisco选择题
  15. mysql rds 定时执行_如何使用脚本自动备份阿里云rds数据库
  16. 科罗拉多州立大学计算机科学,2020年科罗拉多州立大学排名TFE Times美国最佳计算机科学硕士专业排名第81...
  17. 云原生计算动态周报2.13-2.20
  18. ubuntu14.04下安装图片编辑软件pinta
  19. iOS开发 ☞ emoji表情大全
  20. 11 高可用的网站架构

热门文章

  1. 说话技巧三步曲--摘自《所谓高情商 就是会说话》之七个突破口
  2. 【thinkphp 基础 1】thinkphp 如何搭建?如何配置环境运行?
  3. Java经典面试宝典及答案(持续收录)
  4. Python实践4:基于xlwings按字段对Excel中的数据做筛选和分类
  5. 谷歌深圳开办事处,想应聘?先来看看谷歌招过什么样的实习生
  6. 计算机音乐乐谱lemon,原神乐谱lemon
  7. 后台配置——SAP工资回算与年度工资累计计税
  8. 两台电脑通过交叉网线连接一台做为服务器一台做为客户端的配置方法
  9. Spring Boot 结合 ECharts 实现霸气、美观、高大上 图表分析
  10. 2023华为影像大赛全球开赛