接口与抽象类在使用上的区别
以前刚参加工作面试的时候曾经有这题...
接口:
接口(Interface)是对符合接口需求的类的一套规范,接口主要作用是可以帮助实现类似于类的多重继承的功能。接口在定义的时候,不需要考虑具体实现,将“是什么”和“怎么做”分离开来,让接口的实现类根据其具体情况来考虑具体实现。
抽象类:
只要类中有一个抽象方法,此类就被标记为抽象类。实际上抽象类除了被继承之外没有任何意义。
接口与抽象类的区别:
1.接口是多实现
抽象类是单继承
2.接口只是规范了要做什么,没有具体实现
抽象类可以提供默认实现
3.接口中的方法都是抽象方法
抽象类中可以存在非抽象方法
接口与抽象类在使用上的区别:
其实这一部分才是我想总结的,究竟什么时候需要用接口,什么时候需要用抽象类,Java用接口机制来表现不常变化的抽象接口,用抽象类来表现很可能变化的抽象接口。Java对接口本身的变化支持不佳,一旦改变了interface,其所有的实现类都必须同时修改。如果一个接口有很多实现类,接口的修改成本很高,只好借助有版本的interface来调整设计。而抽象类则没有这个限制,只要提供了默认实现,在抽象类中新增的操作就不会侵入现有的实现类。有版本的interface的例子
一个动物类原本有吃的抽象方法
interface Animal{
void eat();
}
当这个接口发布出去,并被实现多次后,再想修改该接口,例如添加一个睡觉方法,就需要修改所有的实现类,只好借组有版本的interface来解决问题
interface ReAnimal extends Animal{
void sleep();
}
Animal的实例能正常工作,而ReAnimal也能适应新的需求并能胜任原有Animal的工作,如果需要使用新的操作,需要向下转型
...
Animal animal =...;
if(animal instanceof ReAnimal){
ReAnimal reAnimal=(ReAnimal)animal;
reAnimal.sleep();
}
这是一种丑陋的解决方案,用来解决丑陋的设计问题。interface能很好适应实现的变化,缺不能很好适应自身结构的变化。

浙公网安备 33010602011771号