【Java面试题】9 abstract class和interface有什么区别?
接口和抽象类的概念不一样。接口是对动作的抽象,抽象类是对根源的抽象。
区别:
1.接口里面只能对方法进行声明,不能有具体的实现,抽象类既可以对方法进行声明也可以对方法进行实现。在抽象类中可以写非抽象的方法,从而避免在子类中重复书写他们,这样可以提高代码的复用性,这是抽象类的优势;接口中只能有抽象的方法。
2.抽象类要被子类继承,接口要被子类实现。一个类只能继承一个直接父类,(正如人不可能同时是生物和非生物),但是可以实现多个接口(吃饭接口、走路接口)。这个父类可以是具体的类也可是抽象类;但是一个类可以实现多个接口。
3.抽象类里面的抽象方法必须全部被子类实现,如果子类不能全部实现,那么子类必须也是抽象类。接口里面的方法也必须全部被子类实现,如果子类不能实现那么子类必须是抽象类。
4.抽象类中的方法都要被实现,所以抽象方法不能是静态的static,也不能是私有的private。
5.抽象级别(从高到低):接口>抽象类>实现类。
例如,模板方法设计模式是抽象类的一个典型应用,假设某个项目的所有Servlet类都要用相同的方式进行权限判断、记录访问日志和处理异常,那么就可以定义一个抽象的基类,让所有的Servlet都继承这个抽象基类,在抽象基类的service方法中完成权限判断、记录访问日志和处理异常的代码,在各个子类中只是完成各自的业务逻辑代码,伪代码如下:
public abstract class BaseServlet extends HttpServlet{ public final void service(HttpServletRequest request, HttpServletResponse response) throws IOExcetion,ServletException { 记录访问日志 进行权限判断 if(具有权限){ try{ doService(request,response); } catch(Excetpion e) { 记录异常信息 } } } protected abstract void doService(HttpServletRequest request, HttpServletResponse response) throws IOExcetion,ServletException; //注意访问权限定义成protected,显得既专业,又严谨,因为它是专门给子类用的 } public class MyServlet1 extends BaseServlet { protected void doService(HttpServletRequest request, HttpServletResponse response) throws IOExcetion,ServletException { 本Servlet只处理的具体业务逻辑代码 } }
划船不用桨、杨帆不等风、一生全靠浪