Java技术——Interface与abstract类的区别

0. 前言  

抽象类与接口Java语言中对抽象概念进行定义的两种机制,正是由于他们的存在对多态提供了非常好的支持。他们两者有很大的相似,甚至可以互换,但是也有区别。对于他们的选择反应了你对该问题的理解。

本文原创,转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52755868

 

1. 两者关系总结  

1抽象类和接口都不能够实例化,但可以定义抽象类和接口类型的引用。一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类。但是实现接口的非抽象类必须要实现该接口的所有方法。抽象类可以选择不用全部实现。

 

2)抽象类提供了继承的概念,它的出发点就是为了继承,继承只能存在一个父类,但是接口不同,一个类可以同时实现多个接口,不管这些接口之间有没有关系,所以接口弥补了抽象类不能多重继承的缺陷

 

3)抽象类中可以包含成员变量、抽象方法、具体方法、构造方法等。需要注意的是抽象类中不一定必须有抽象方法,而有抽象方法一定是抽象类。而接口中只能存在成员变量和抽象方法,这些成员变量都会自动变为为public static final,即静态的不可变的成员数据(一般都不在接口中定义成员数据),而且它的所有方法都是抽象的。

这里有个小问题,为什么接口的成员变量都会自动变为为public static final

这是因为接口不可实例化,它的所有元素都不必是实例(对象)层面的,显然static 满足了这一点。而且如果接口的变量能被修改,那么一旦一个子类实现了这个接口,并修改了接口中的非 final 变量,而该子类的子类再次修改这个非 final 的变量后,造成的结果就是虽然实现了相同的接口,但接口中的变量值是不一样的,显然final 满足了这一点。

 

4)抽象类是对类抽象,是面向整个类的自下而上的设计理念,一般是先有各种子类,再有把这些有关系的子类加以抽象为父类的需求。而接口是对行为的抽象,是面向行为的自上而下的设计理念,接口根本就不需要知道子类的存在,只需要定义一个规则即可。


2. 结束语   

通过以上从实现程度、一继承多接口、内部成员结构、以及设计理念四个角度对接口和抽象类的区别进行理解之后,便可以在选择使用接口或者抽象类时做出更加合理的设计。转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52755868

原文地址:https://www.cnblogs.com/qitian1/p/6461470.html