我在求职一份Android应用开发实习生时,一家公司的面试官问了我这样的一道题目:“请谈谈你对抽象类与接口的理解?”我当初的回答,仅是简单解释了什么是抽象类,什么是接口,而至于它们之间的异同、实现方式以及具体应用等都没有给予说明。实际上,通过这样一道面试题,也反映出自身当前的一些问题。主要有重要知识点的肤浅认知,回答问题的方式以及组织表达的能力有待加强等。
我所信奉的原则,“有问题,找方法;用方法,解问题。”通过查阅各种资料和进行具体实践,重新理解“抽象类与接口”。
Java语言是一种OOP(面向对象编程)的语言,而OOP的三大特性是抽象、继承和多态。Java语言中的抽象类和接口就是反映抽象特性的两大机制。抽象类,简而言之就是使用关键字abstract所修饰的类,这样的类中既可以包括实现的方法,又可以包括抽象的方法(没有实现的方法),也可以包括默认类型为friendly修饰的数据成员(抽象类被继承后,数据成员可以被重新定义或重新赋值);接口,简而言之就是一种特殊的抽象类,它使用关键字interface来定义,主体里面包括抽象的方法和默认类型为public static final 所修饰的数据成员(并且需要赋值,接口被实现后数据成员的值不能修改)。
抽象类不能实例化对象,必须通过继承并且完全实现抽象类中的抽象方法后的类才能做对象实例化,若是部分实现抽象方法,那这样的类还是抽象类。Java语言,类只能单继承,但是可以实现多个接口,对于所实现的每个接口,实质上就是要完全实现每个接口中的抽象方法。
抽象类与接口的本质区别反映在设计理念的不同,前者表示的是一种“is-a”关系,而后者表示的是“like-a”关系。因此,在OOD中,应该根据问题域的侧重点,确定关系,从而设计合适的抽象类与接口,采用对抽象类的单一继承和对接口的实现,合理解决问题。
另外,抽象类和接口也是实现多态特性重要机理。一个继承了抽象类和实现了接口的类,其所实例化的对象,既是这个抽象类的对象,也是这个接口的对象。换句话说,可以把这样的一个类赋值给其抽象类或者接口的对象引用,然后利用动态绑定技术,实现多态效果。
总结:抽象类和接口在Java语言中是非常重要的知识点,通过从它们的概念、差异、实现方式和具体应用理解,并且从面向对象设计的思想进一步理解抽象类与接口的本质。