面向对象
接口与抽象类的区别
语法区别
1)抽象类可以提供成员方法的实现细节, 而接口中只能存在 public abstract 方法; 2)抽象类中的成员变量可以是各种类型的, 而接口中的成员变量只能是 public static final类型的; 3)接口中不能含有静态代码块以及静态方法, 而抽象类可以有静态代码块和静态方法; 4)一个类只能继承一个抽象类, 而一个类却可以实现多个接口.
设计上的区别
抽象类是对事物的抽象, 而接口是对行为的抽象.
- 抽象类除了行为之外还具有一些属性(成员), 或者一些特有的性质(自身已经实现的方法). 而子类在继承时, 不仅继承了属性, 还继承了方法, 所以就导致了子类必然是属于父类的, 只是父类的特化版. 比如喷气式飞机相对于飞机, 跑车相对于车.
- 接口是仅仅对行为进行描述, 并且一个类可以实现多个接口. 子类实现接口时, 并不一定是属于接口这个范畴的, 而只是具有接口的方法. 比如”飞”, 飞机可以飞, 鸟可以飞. 飞机和鸟都实现了飞的接口, 都具有飞的功能. 而鸟和飞机并不会属于同一类.
还有个鲜明的例子, 比如门这个抽象类, 具有开门和关门这两个抽象方法. 现在要新增报警方法, 如果在抽象类中直接进行加入, 那么以门为派生的所有门都要被迫实现报警这个功能了. 这是不合理的, 因为不是所有门都可以报警, 但是所有门都可以开关. 所以应该把警报设置成接口, 因为烟雾报警器之类的也可以报警, 报警应当是个功能, 而不是门固有的方法.