1.首先说一下他们的理论区别
a:abstract是”is a”的关系(’是什么‘的意思,例:树是植物 单继承关系),interface是”like a”的关系(“像什么”的意思,例:我跟我爸爸长的很像,我兄弟跟我爸爸长的也很像 多继承关系);
b、抽象类被子类继承,接口被类实现.
c、抽象类中可以做方法申明,也可以做方法实现(里面写实现可以用private,但是用抽象类修饰的方法不能用private修饰),接口只能做方法申明;
d、抽象类中可以有成员变量,接口中不能有成员变量;
e、抽象类里的方法可以被protected修饰和public 如果不加修饰符这是默认的default不能用private修饰没有意义,接口只能被public修饰。
下面是自己的理解加上网络中各种大神理解的总结 。
a、通过上面分析我们不难发现定义了abstract的类只能被别的类继承而且被继承的类只能继承一个抽象类,
但是接口就不一样我们可以给一个类定义多个接口,这是我感觉这2个java中定义抽象类的最大区别。
所有在做项目的时候不难发现最上层为接口,中间层次为抽象类(因为抽象类可以实现也可以方法声明),往下就是我们的实现类。(求大神看看自己理解不知道对不对)
在现在的项目中全是对于数据库的增删改查,所以我们把增删改查方法申明写成一个接口,然后在经过调用来实现方法的复用从而可以减少代码,提高复用。
从复用性的角度因该还看出来了java中重要的一个原则“开闭原则”。
(1)开闭原则的2个特点
对修改关闭,
在运用的接口或者抽象java类的时候 ,我们的抽象层因该预见所有可能的扩展。因此在写完抽象层后任何情况下不会改变。
这样就满足了开闭原则的对修改关闭这一条。
对扩展开放。
在实现抽象类和接口的新的具体类可以改变系统的行为,所以系统的设计对扩展是开放的满足对扩展开放。
b、接口的理解
接口因为只有方法声明没有定义的, 因此可以理解成接口是子类实现其方法声明而不是继承其方法。但是一般类的方法可以有方法体,那么叫继承比较合理。因为接口就是个规范,是个没方法体的方法声明集合。
我来举个例子吧:接口可以比作协议,比如我说 一个协议是“杀人”那么这个接口你可以用砍刀去实现,至于怎么杀砍刀可以去实现,当然你也可以用抢来实现杀人接口,但是你不能用杀人接口去杀人,因为杀人接口只不过是个功能说明,是个协议,具体怎么干,还要看他的实现类。那么一个包里面如果有接口,你可以不实现。这个不影响你使用其他类。