文章转自 http://dy.163.com/v2/article/detail/EGPGS93U053692ZG.html
如果有java编程经验的同学可能会发现,接口倒是经常写,但是抽象类好像并不怎么熟悉,这两者的具体作用到底是什么呢?有什么区别呢?
先说对这两个概念的理解
我们先说抽象类,其实抽象类的设计理念是“is-a”关系,就是说它更关心的是被抽象的这些个对象是什么,比如说藏獒,贵宾,哈士奇,我们要给他们写抽象类,那抽象出来这个类就是狗狗类,无论什么品种的狗,都是狗狗。
再说说接口,接口的设计理念是“has-a”关系,它关心的能做什么,比如说你可以写一个接口,里面有吠()这个方法,再写一个接口,里面有跑()这个方法,那么你可以让狗狗类实现这两个方法,让狗狗拥有这两项功能。而你可以发现,人类,喵类也都可以实现整个跑这个接口来拥有这项功能。
所以在java中,类的单继承多实现的概念就好理解了,狗狗只能继承狗狗这个类,不可能让它去继承人类或者喵类,但能实现n多个接口,跑、跳、吠、打滚。
在应用场景中,抽象类用于同类事物,而接口多是可以横跨很多个类。
他们有哪些具体区别呢?
1)抽象类则可以包含普通方法,接口中的普通方法默认为抽象方法。
2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的,并且必须赋值,否则通不过编译。
3)接口不能包含构造器,抽象类可以包含构造器,抽象类里的构造器并不是用于创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始化操作。
4)接口里不能包含初始化块,但抽象类里完全可以包含初始化块。
5)就是我们所说的单继承多实现了。
最后,送上我在一本书上看到的特别绕的三句话,接口可以继承接口,抽象类可以实现接口,抽象类可以继承具体类。