版本一

成员的区别

类别 构造方法 成员变量 成员方法
抽象类 有构造方法,用于子类实例化的使用 可以是变量,可以是常量 可以是抽象的,也可以是非抽象的
接口 没有构造方法 只能是常量,默认修饰符public static final jdk1.7只能是抽象的。默认修饰符:public abstract (推荐:默认修饰符请自己永远手动给出)
jdk1.8可以写以default和static开头的具体方法

关系区别

类与类:
继承关系,只能单继承。可以多层继承。

类与接口:
实现关系,可以单实现,也可以多实现。
类还可以在继承一个类的同时实现多个接口。

接口与接口:
继承关系,可以单继承,也可以多继承。

体现的理念不同

抽象类里面定义的都是一个继承体系中的共性内容。
接口是功能的集合,是一个体系额外的功能,是暴露出来的规则。

接口和抽象类的概念不一样。接口是对动作的抽象,抽象类是对根源的抽象。 抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。

版本二

接口和抽象类的相同点

1、抽象类和接口都不能被直接实例化,他们都需要被继承或实现。(类和抽象类中间是继承关系,类和接口是实现关系,接口和接口之间可以有继承关系) 2、接口和抽象类都可以包含抽象方法,实现或继承他们的普通类必须重写抽象方法。 3、抽象类和接口,都可以体现在多态中,作为变量数据类型接收子类实例对象。

接口和抽象类的不同点

1、用途不同: 抽象类中抽取了多个子类的共性,作为模版存在,用于被子类继承实现代码复用。 接口定义了某种功能的规范,当类需要新增其功能时,只需要实现接口,重写接口的规范(抽象方法)即可,同时接口也弥补了java单继承的缺陷。 2、接口里只能包含抽象方法,抽象类则可以包含普通方法和抽象方法。 3、接口不能定义静态方法,抽象类可以(jdk1.8之后可以)。 4、接口中的成员变量是静态常量, 使用public static final修饰。抽象类则可以定义静态常量,也可以定义非静态成员变量。 5、接口不能被创建为对象,不含构造器,抽象类可以被实例化为对象,抽象类具有构造器。 抽象类是可以被实例化,子类对象创建的时候,创建抽象类父类对象。 抽象类是可以有静态代码块,构造代码块,构造器方法,抽象类就既可以有实例成员、也可以有静态成员。

抽象类强调的是从属关系,接口强调的是功能。最后一张表格说明问题~~
image.png

总结

当你关注一个事物的本质的时候,用抽象类;当你关注一个操作的时候,用接口。