1.抽象类
(1)有抽象方法的类被定义为抽象类,但抽象类可以没有抽象方法。
(2)抽象方法不能实例化,无法使用new关键字创建对象。
(3)抽象类有构造器,但主要用于被其子类调用。
子类继承父类(抽象类)要求子类一定要实现抽象方法
2.接口
(1)接口是特殊的“抽象类”,抽象的更彻底。
(2)接口也不能实例化。
(3)普通类必须实现接口,抽象类可以实现也可以不实现。
抽象类和接口的异同点
相同点:
(1)都不能被实例化,都位于继承树的顶端,用于被其他类实现或继承;
(2)接口和抽象类都可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法。
不同点 :
(1)抽象类使用abstract声明,接口使用interface声明;
(2)抽象类中的方法可以有方法体(就是具体的功能实现),接口中的方法没有方法体;
(3)抽象类中的成员变量可以是各种类型的,接口中的成员变量只能是public static final;
(4)抽象类中可以含有静态代码块及静态方法,接口中不能含有;
(5)一个类只能继承一个抽象类,但可以实现多个接口;
(6)抽象类是自下向上的一种抽象,接口是自上向下的一种行为准则,是一种规范。
举例
Map、AbstractMap与HashMap
Map是一个接口,AbstractMap实现了Map这个接口,而HashMap实现了Map接口并且继承了Abstract类。
public interface Map<K,V>
public abstract class AbstractMap<K,V> implements Map<K,V>
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>
看源码,我们可以知道AbstractMap实现了Map接口中的所有方法,并且在类中没有抽象方法,那HashMap为什么还要实现Map这个接口呢?
这就印证了接口是自上向下的行为规范,抽象类是自下向上的一种抽象。将实现Map接口的HashMap,TreeMap等向上抽象为AbstractMap,这样可以提高代码的复用性,便于扩展与维护。所以,这就是为什么HashMap既继承了AbstractMap,又实现了Map接口。