抽象类特性

1、抽象类不允许被实例化,只能被继承。
2、抽象类可以包含属性和方法。方法既可以包含代码实现,也可以不包含代码实现。不包含代码实现的方法叫做抽象方法。
3、子类继承抽象类,必须实现抽象类中的所有抽象方法。

接口特性

1、接口不能包含属性(也就是成员变量)
2、接口职能声明方法,方法不能包含代码实现
3、类实现接口的时候,必须实现接口中声明的所有方法。

抽象类的作用

1、代码复用
2、多态的优雅实现
关于第二点的具体解释:
继承不一定能够实现多态,继承+重写才能实现多态。
多态不一定需要抽象类,但是抽象类能够提升维护性和可读性。
如果某个方法是空实现而不是抽象类,子类可能忘记重写这个方法。
而且,一个空实现会让维护者感到奇怪。

接口的作用

解耦。接口是对行为的一种抽象,相当于一组协议。调用者只需要关注抽象的接口,而不需要了解具体的实现,可以降低代码间的耦合性。

C++通过抽象类模仿接口

C++只有抽象类,没有接口。
首先回顾之前的接口定义:
1、没有成员变量
2、只有方法声明,没有方法实现
3、实现接口的类必须实现接口中的所有方法

class Strategy { //用抽象类模拟接口public:~Strategy();virtual void algorithm() = 0;protected:Strategy();
};

抽象类Strategy没有定义任何属性,并且所有方法都声明为virtual类型(等同于java的abstract关键字).这样所有的方法都不能有代码实现,并且每个继承这个抽象类的子类都要实现这个方法。
从语法特性上来说,这个抽象类就相当于一个接口

使用普通类实现接口

将构造函数从public修改为protected,在方法实现中抛出异常,强制子类必须实现父类中的方法。
下面,使用java中的普通类来模拟接口

public class MockInteface {protected MockInteface() {}public void funcA() {throw new MethodUnSupportedException();}
}

MethodUnSupportedException异常,来模拟不包含实现的接口,并且能够强迫子类在继承这个父类的时候都主动实现父类的方法,否则就会在运行的时候抛出异常。

两者区别

接口与抽象的重要区别,出去语法特征,最重要的是概念上,抽象更像是一种类的定义,而接口更像是协议。前者是属于和继承的关系,而接口是包含和具有的关系。
抽象:is-a
接口:has-a,表示具有某些功能。
类的继承层次上来看,抽象类是一种自下而上的设计思路,现有子类的代码重复,再抽象成上层的父类。接口相反,是一种自上而下的设计思路,一般是先设计接口,再去考虑具体实现。

【设计模式之美】<Reading Notes>抽象类与接口相关推荐

  1. Java查漏补缺(08)关键字:static、单例设计模式、理解main方法、类的成员之四:代码块、final关键字、抽象类、接口、内部类、枚举类、注解、包装类

    Java查漏补缺(08)关键字:static.单例设计模式.理解main方法.类的成员之四:代码块.final关键字.抽象类.接口.内部类.枚举类.注解.包装类 本章专题与脉络 1. 关键字:stat ...

  2. JavaSE自学笔记013_Real(抽象类、接口、两种设计模式)

    JavaSE自学笔记013_Real(抽象类.接口) 一.基本概述 (一)抽象类(关键字:abstract) //抽象方法 public abstract class Animal{abstract ...

  3. day03--java基础编程:面向对象,构造方法,代码块讲解,this super,static,final,访问修饰符,方法重写,向上/下造型,main方法,抽象类,接口,设计模式,异常,内部类

    1 Day06–面向对象1 1.1 面向对象 1.1.1 概念 推荐看的书:Thinking in java 概念:所谓的面向对象是一种编程思想,通过这种思想可以把生活中的复杂事情变得简单化,从原来的 ...

  4. JavaSE面向对象:继承、多态、Super、Object类、重写、static、final、静态成员、懒汉式、饿汉式、单例设计模式、初始化块、抽象类、抽象方法、接口

    感谢尚硅谷免费提供的视频 继承 ** 理解 ** 生活中的继承:子女继承了父母的财产或相貌或才华 java中的继承:一个类不用自己定义属性或方法,就已经具备了另一个类的属性和方法 把这种现象称为jav ...

  5. day03--java基础编程:面向对象,构造方法,代码块讲解,this super,static,final,访问修饰符,方法重写,向上_下造型,main方法,抽象类,接口,设计模式,异常,内部类

    1 Day06–面向对象1 1.1 面向对象 1.1.1 概念 推荐看的书:Thinking in java 概念:所谓的面向对象是一种编程思想,通过这种思想可以把生活中的复杂事情变得简单化,从原来的 ...

  6. 抽象类与接口与模板方法设计模式

    抽象类特点: 1,抽象方法一定在抽象中. 2,抽象方法和抽象类都必须被abstract关键字修饰. 3,抽象不可以用new创建对象,因为调用抽象方法没意义. 4,抽象类中的抽象方法要被使用,必须由子类 ...

  7. java 单例内部类_9 java的关键字static、单例设计模式、初始化块、关键字final、抽象类、接口、内部类...

    static关键字 当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new关键字才会产生出对象,这时系统才会分配内存空间给对象,其方法才可以供外部调用.我们有时 ...

  8. Java 设计模式 Day2 之面向抽象原则:接口(interface)的设计应用与抽象类的区别

    文章目录 前言 一.接口(interface)的设计要点与抽象类的区别 二.接口(interface)的应用实例 2.1.创建一个接口(interface) 2.2.创建实现接口的类 2.3.通过接口 ...

  9. 【设计模式】抽象类与接口

    一.抽象类 // 抽象类 public abstract class Logger {private String name;private boolean enabled;private Level ...

最新文章

  1. 全面认识网络诊断命令功能与参数——netsh diagnostic命令
  2. jQuery.form.js使用
  3. 一般处理程序使用Session报错(未将对象引用设置到对象实例)
  4. 【Avalon】绑定块(监听器):管理每一个绑定
  5. Taro+react开发(84):taro路由跳转
  6. python 爬虫难吗_python写爬虫难吗
  7. Dubbo源码分析系列之-深入Dubbo扩展机制
  8. C++开发 面试问题总结(中兴、CVTE、瑞晟、华为、YY)
  9. oraclemt 无法启动服务_调整MT后台 解决站点压力问题
  10. Daily Scrum 9.26
  11. hdu acm 1540
  12. ubuntu1804安装python3.8+odoo14
  13. python got an unexpected keyword argument
  14. php strict warning,PHP Warning: Unsupported declare 'strict_types' in ...
  15. 解决V-Rep接近传感器(距离传感器、超声波传感器、红外传感器)不能正常识别问题
  16. 智能ABC拼音输入法你真的会用吗
  17. php ci框架后台管理,ci: 羽翼后台管理平台是一个简单的博客系统,后端基于CodeIgniter,前端基于Semantic UI 2.2.10...
  18. 哈哈...汗汗...
  19. redis基数树rax源码分析(1)
  20. (OJ)Java面向对象-构造方法

热门文章

  1. SVN还原与SVN更新区别
  2. elf 取路径_c – 获取主要可执行文件的ELF标题
  3. edusrc0day挖掘技巧
  4. click点击后鼠标移去就失效怎么实现_鼠标右键失灵怎么办,你知道原因吗?
  5. 纯CSS实现3D照片墙
  6. ScrollReveal.js – 帮助你实现超炫的元素运动效果
  7. 实现用户操作指引功能
  8. 前端生态混乱,AMPMIP在努力做标准化工作
  9. glup打包代码不更新
  10. 简单的GTK窗体搭建