接口与抽象类的区别

  首先,接口与抽象类是Java面向对象设计的基础机制。

  接口,是对行为的抽象,它是抽象方法的集合。利用接口能实现API定义与实现分离的目的,不能实例化,只能包含抽象方法、常量。任何field都隐含了public static final修饰。同时没有非静态方法,要么是抽象方法,要么是静态方法。Java中定义了很多接口。如List、Set接口。

  抽象类,用abstract修饰,可以实现代码复用。除了不能实例化外,其他与Java类并没有太大差别。可以有一个或多个抽象方法,也可以没有抽象方法。抽象类大多用于抽取Java相关类的共同方法实现和共同成员变量,通过继承来达到代码复用的效果。Java标准库中Collections中就有很多部分被抽取成抽象类,如java.util.ArrayList类。

  Java实现interface用implements关键字,继承abstract class用extends关键字。Java不支持多继承,除了接口可以多继承接口,类可以实现多个接口,接口不可以继承抽象类只能继承接口。

  面向对象设计的基本要素:封装、继承、多态

  封装:增加了类的安全性与隐藏内部实现的细节,与外部划定了合理的界限,避免外部调用者接触到内部的细节。日常开发中暴露内部细节导致的bug过多,比如在多线程暴露内部状态,导致并发修改问题。

  继承:使我们进行代码复用的主要机制,类似于车、公交车、轿车的归纳总结;另一方面继承也类似于一种紧耦合的一种关系,父类代码修改,也会引起子类的行为。所以滥用继承可能会起到反效果。

  多态:可能立即想到,重写(override)、重载(overload)、向上转型(父类引用指向子类对象)。简单说就是,父子类中相同名字和参数方法,有着不同的实现,重载则是在同一个类里有着相同的方法名称,不同的参数。返回值不同不是重载,编译都会出错。

  面向对象的设计原则:S、O、L、I、D

  单一原则(Single Responsibility):类或者对象最好只具有单一职责,如果发现在本类中承担有多种义务,可以考虑将其拆分。

  开放封闭原则(Open-Close Open for extension Close for modification):设计要对内扩展开放,对修改关闭。尽量避免新增功能的同时,修改已有实现

  里式替换原则(Liskov Substitution):进行继承关系抽象时,凡是用到父类或基类的地方,都可以用子类进行替换。

  接口分离(Interface Segregation):在进行接口和类定义时,如果一个接口存在多个方法时,实现它的类可能只会用到部分方法,这就减少了类的内聚性,通常会将该接口,划分为多个接口,将行为进行解耦,在未来维护中,如果某个接口有变,不会对使用其他接口的子类造成影响。

  依赖分离(Dependency Inversion): 实体应该依赖抽象而不是具体实现。也就是高层次模块不依赖低层次模块,而是基于抽象。这一原则可以保证耦合度