【JavaSE基础】抽象类和接口的区别

一、语法层面上的区别

1)抽象类可以提供成员方法的实现细节(注:可以只包含非抽象方法),而接口中只能存在public abstract方法,方法默认是public abstract的,但是,Java8中接口可以有default方法;

2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;

3)抽象类可以有静态代码块和静态方法和构造方法;接口中不能含有静态代码块以及静态方法以及构造方法。但是Java8中接口可以有静态方法;

4)一个类只能继承一个抽象类,而一个类却可以实现多个接口。

二、设计层面上的区别

1)抽象层次不同。抽象类是对类的整体抽象,包括属性和行为的抽象。而接口只是对行为的抽象。

2)跨域不同。抽象类所体现的是一种继承关系,父类和派生类之间必须存在"is - a"关系,即父类和派生类在概念本质上是相同的。对于接口则不然,并不要求接口的实现者和接口定义在概念本质上是一致的,仅仅是实现了接口定义的契约而已,而设计理念是"has - a"的关系(有没有、具备不具备的关系),实现它的子类可以不存在任何关系,共同之处。例如猫、狗可以抽象成一个动物类抽象类,具备叫的方法。鸟、飞机可以实现飞Fly接口,具备飞的行为。

3)设计层次不同。对于抽象类而言,它是自下而上来设计的,我们要先知道子类才能抽象出父类,而接口不同,他根本就不需要知道子类的存在,只需要定义一个规则即可,至于什么子类、什么时候怎么实现它一概不知。比如我们只有一个猫类在这里,如果你这时候就抽象成一个动物类,是不是设计有点过度?起码要有两个动物类,猫、狗在这里,我们在抽象他们的共同点形成动物抽象类。所以说抽象类往往都是通过 重构而来的!但是接口就不同,比如说飞,根本不知道会有什么东西来实现这个飞接口,怎么实现也不得而知,我们要做的就是事前定义好飞的行为接口。所以说抽象类是自底向上抽象而来的,接口是自顶向下设计出来的。

你可能感兴趣的:(JavaSE)