抽象类与接口

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 
public abstract class AbstractMap implements Map 
public class HashMap extends AbstractMap  implements Map

  看源码,我们可以知道AbstractMap实现了Map接口中的所有方法,并且在类中没有抽象方法,那HashMap为什么还要实现Map这个接口呢?
  这就印证了接口是自上向下的行为规范,抽象类是自下向上的一种抽象。将实现Map接口的HashMap,TreeMap等向上抽象为AbstractMap,这样可以提高代码的复用性,便于扩展与维护。所以,这就是为什么HashMap既继承了AbstractMap,又实现了Map接口。

你可能感兴趣的:(抽象类与接口)