关于abstract class和interface这两者的区别,本人初学Java时被这个问题困扰了许久。网上搜了各种各样的答案,加上自己的理解,今天来整理一下,如有纰漏,还请高手指正!
总的来说,抽象类是普通类的一个特例,具有普通类有的和没有的特性;而接口表示一种规范、标准,用于声明方法,存放一些不能改变的静态变量。
下面分别从两者的语法和应用两个方面来总结:
1.语法上的区别:
1)构造方法:抽象类可以有,接口中不能有。
2)成员变量:抽象类可以有普通成员变量,或静态成员变量;接口中只能有默认为(public static final)修饰的变量。
3)方法:抽象类中可以有普通方法、静态方法,也可以有抽象方法;接口中的方法必须都是抽象方法。
4)访问权限:抽象类中的静态成员变量的访问权限可以任意,抽象方法的访问权限除了不能为private,其他均可;接口中抽象方法的访问权限只能为public。
5)继承与实现:一个类只能继承一个抽象类,但可以实现多个接口。
如果不明白,可以自己分别写一个抽象类和一个接口,从以上几个方面来验证一下,加深理解。
2.应用上的区别:
1)抽象类在代码实现方面发挥作用,可以实现代码的重用。
模板方法设计模式是抽象类的一个典型应用。假设某个项目的所有Servlet类都要用相同的方式进行权限判断、记录访问日志和处理异常,这时就可以定义一个抽象类,让所有的Servlet都继承该抽象类,在该抽象类的service方法中完成以上3个工作,而在各个子类中只是完成各自的业务逻辑代码。
父类方法中的某段代码不确定,留给子类干,就要用到模板方法设计模式。
2)接口在系统架构设计方面发挥作用,主要用于定义模块之间的通信契约。
PS:听着钢琴曲,敲着心爱的代码和技术知识点,有种谱写科学艺术作品的赶脚,2333……