1.核心区别
-
抽象类可以更好的实现代码的复用
抽象类中不一定都是抽象的方法,也可以有具体实现的方法
,这样就可以把大家公用的方法提升到抽象类中
,然后具体的方法可以留给子类自己实现。 -
抽象类能实现更好的扩展
实现类要想扩展只能改变接口,因为接口和抽象类设计出来作为被公共使用的对象,你不会知道有多少人在使用这个接口或者抽象类,一旦修改接口或抽象类,势必要惊动使用者,而修改的内容,使用者也不一定能用到。而使用抽象类,实现类可以直接扩展,并且不会影响其它实现类。 -
抽象的对象不一样
接口是对动作
的抽象,抽象类是对根源的抽象(即对事物本质的抽象)。 -
接口更加合适实现多态
多态主要是分离“做什么”和“怎么做”。由于接口更关注于动作的实现,更适合实现多态(当然抽象类也可以实现多态)。
2.用法上的区别
- 共同点:都不能被实例化。
- 抽象类
(1)抽象方法必须为public或者protected,缺省情况下默认为public。
(2)如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。 - 接口
(1)接口中可以含有 变量和方法,接口中的变量会被隐式地指定为public static final变量。而方法会被隐式地指定为public abstract方法且只能是public abstract方法。
(2)接口中所有的方法不能有具体的实现。接口中的方法必须都是抽象方法。从这里可以隐约看出接口和抽象类的区别,接口是一种极度抽象的类型,它比抽象类更加“抽象”,并且一般情况下不在接口中定义变量。 - 语法层面上的区别
(1)抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;
(2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
(3)抽象类可以有静态代码块和静态方法,而接口中不能含有静态代码块以及静态方法;
(4)一个类只能继承一个抽象类,而一个类却可以实现多个接口。