接口:
接口里的方法和抽象类中的方法一样,它的方法是抽象的,也就是说接口是不能具体化成对象的,
抽象类:
所谓抽象类是指只声明方法的存在而不去实现它的类,抽象类不能实例化,也就是不能创建对象。
抽象方法和抽象类必须使用abstract修饰符来定义,有抽象方法的类只能定义成抽象类,抽象类里可以没有抽象方法。
区别:
表象:
抽象类可以给出一些成员的实现,接口却不包含成员的实现,抽象类的抽象成员可被子类部分实现,接口的成员需要实现类完全实现,一个类只能继承一个抽象类,但是可以实现多个接口等。
深层次理解:
1.类是对对象的抽象,抽象类是对类的抽象,接口是对行为的抽象。接口是对类的局部(行为)进行抽象,而抽象类是对类整体(字段、属性、方法)的抽象。不论接口、抽象类、类、甚至对象,都是在不同层次、不同角度进行抽象的结果。他们的共性就是抽象。
如果行为跨域不同类的对象(飞机、麻雀、超人),可使用接口;对于一些相似的类的对象(猫狗),可继承抽象类。
2.抽象类是从子类中发现公共的东西,泛化出父类,然后子类继承父类,而接口是根本不知道子类的存在,方法如何实现还不确定,预先定义。
3.抽象类是自底向上抽象出来的,而接口则是自顶向下设计出来的。
类图
使用抽象类前
使用抽象类后
为什么有了接口还要增加一层抽象类?
让抽象类去实现接口,而不是每个实现类去实现接口,实现类一致的行为(或者说大部分一致的行为)在抽象类中进行实现,而不一致的行为(或者一小部分不一致的行为),在抽象类中写成抽象方法,让子类去重写,减少子类重写接口所有方法的负担。