很多常见的面试题都会问到抽象类和接口有什么区别,什么情况下会用到抽象类,什么情况下会用到接口等问题。在本文中,我们将详细讨论这些主题。在讨论它们之间的区别之前,我们先来看看抽象类和接口的特点。抽象类抽象类用于捕获子类的一般特征。它不能被实例化,只能作为子类的父类。抽象类是用于在继承层次结构中创建子类的模板。以JDK中的GenericServlet为例:voidinit(){//其实现}//Servlet相关的其他方法}HttpServlet类继承GenericServlet时,提供服务方法的实现:publicclassHttpServletextendsGenericServlet{voidservice(ServletRequestreq,ServletResponseres){//实现}protectedvoiddoGet(HttpServletRequestreq,HRestpServlet){p//实现}protectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp){//实现}//一些与HttpServlet相关的其他方法}抽象方法。如果一个类实现了某个接口,那么它就继承了这个接口的抽象方法。就像契约模式一样,如果你实现了这个接口,那么你必须保证方法被使用。界面只是一种形式,界面本身不能做任何事情。以Externalizable接口为例:publicinterfaceExternalizableextendsSerializable{voidwriteExternal(ObjectOutputout)throwsIOException;voidreadExternal(ObjectInputin)throwsIOException,ClassNotFoundException;}当你实现这个接口时,需要实现上面两个方法:publicclassEmployeeimplementsExternalizable{intemployeeId;字符串员工姓名;@OverridepublicvoidreadExternal(ObjectInputin)抛出IOException,ClassNotFoundException{employeeId=in.readInt();employeeName=(String)in.readObject();writeExternal(ObjectOutputout)抛出IOException{out.writeInt(employeeId);out.writeObject(员工姓名);}}abstractclassvsinterface何时使用抽象类和接口如果你有一些方法并希望其中一些方法具有默认实现,那么使用抽象类。如果要实现多重继承,则必须使用接口。由于Java不支持多重继承,子类不能继承多个类,但可以实现多个接口。所以可以使用接口来解决。如果基本功能不断变化,那么就需要使用抽象类。如果你不断改变基本功能并使用接口,你需要改变所有实现接口的类。Java8中的默认方法和静态方法Oracle已经开始尝试在接口中引入默认方法和静态方法,以减少抽象类和接口的区别。现在,我们可以为接口提供默认方法实现,而无需强制子类实现它。
