【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只处理的具体业务逻辑代码
        } 

}

 

posted @ 2018-03-16 09:52  十月围城小童鞋  阅读(162)  评论(0编辑  收藏  举报