java抽象类和接口的区别

作为初学者,刚接触抽象类和接口时常会分不清它们的区别和用途,查阅相关资料后特此进行总结,希望能帮助到更多的人。

接口:
使用关键字interface声明,需要其他类使用关键字implement实施。
下面是一个典型的接口定义:
在这里插入图片描述
下面是一个类对它进行实施:
在这里插入图片描述
一个接口就好像是你和客户规定的一个协议,客户只告诉你需要哪些方法,而你得自己构造类去实现这个接口,并且对里面的所有方法都得实现。一个接口就是一个抽象方法的集合,里面没有rep,没有构造器,没有方法实现,所有方法都必须声明为public,接口之间可以相互继承。

抽象类:
使用关键字abstract进行声明,可以被子类通过关键字extends继承。
下面是一个典型的抽象类的定义:
在这里插入图片描述
一个抽象类逻辑上是介于接口和普通类之间的,它和普通类一样可以拥有构造器,可以有具体方法实现,可以用public,protected等关键字修饰,可以运行,可以被其他类继承,但不能实例化。同时也可以像接口一样定义一些抽象方法,然后在子类中进行重写。

下面对二者做一个简单对比:

抽象类 接口
通过关键字abstract声明 通过关键字interface声明
可以有构造器,不能实例化 没有构造器,不能实例化
可以添加main方法运行 不能运行
可以有rep 没有rep
可以用关键字public,private,protected进行修饰 默认为public,且不能更改
可以实施接口 ,可以继承类 只能继承一个或多个接口
可以有方法实现 只能是方法声明,不能实现

使用范围:
二者都是对多个类中的共性进行提取,然后进行统一管理,都是为了提高代码的可复用性,可扩展性,可维护性和可读性。
接口比抽象类更为抽象,声明时也要更为小心,因此里面的方法需要十分稳定,因为如果对里面的方法进行更改,删除或添加,则所有对它实施的子类都得进行更改。
而抽象类由于可以进行方法的实现,因此若不同类中拥有完全相同的方法的实现,则可以在抽象类中实现该方法,然后让各个类对它进行继承即可,各个类中独有的方法则在各个类中进行实现。

一般做法是,先使用接口对各个类中稳定且通用方法进行声明,然后使用一个抽象类对这个接口进行实施,若各个类中拥有公共方法,且实现完全一样,则将这些方法直接在抽象类中进行实施,然后让各个类继承这个抽象类,最后在各个类中添加自己独有的方法。这样,如果添加了一个公共方法,则只需在接口中添加声明,然后在抽象类中添加实现即可。这样能大大提高代码的可复用性和可维护性。
这里推荐一个博客,写得十分详细深入:
https://blog.csdn.net/ttgjz/article/details/2960451