abstract class和interface有什么区别

原创 小伙子  2019-03-26 17:19:37  阅读 99 次 评论 0 条

abstract class和interface有什么区别

两种的语法区别 

1. 抽象类可以有构造方法,接口不能有构造方法 

2. 抽象类中可以有普通成员变量,接口中没有普通成员变量 

3. 抽象类中可以包含非抽象的普通方法,接口中的所有方法必须是抽象的,不能有非抽象的普通方法 

4. 抽象类中抽象方法的访问类型可以是public,protected和默认类型虽然(eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型,并且默认即为public abstract类型 

5. 抽象类中可以包含静态方法,接口中不能包含静态方法 

6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型 

7. 一个类可以实现多个接口,但只能继承一个抽象类


两者在应用上的区别 

接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。而抽象类在代码实现方面发挥作用,可以实现代码的重用,例如,模块方法模式是抽象类的一个典型应用: 

假设某个项目的所有Servlet类都要用相同的方式进行权限判断、记录访问日志和处理异常的代码,在各个子类中完成各自的业务逻辑代码,伪代码如下:

public abstract class BaseServlet extends HttpServlet {
    @Override
    protected final void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // TODO Auto-generated method stub

        //记录访问日志
        //进行权限判断
        if (/*具有权限*/) {
            try{
                doService(request,response);
            }
            catch(Exception e){

                //记录异常信息
            }

        }

    }

    protected abstract void doService(HttpServletRequest request, HttpServletResponse response)throws IOException,ServletException {
        // TODO Auto-generated method stub
        //注意访问权限定义成protected,这样显得即专业,有严谨,是专门给子类用的

    }

}
public class MyServlet extends BaseServlet{
    @Override
    protected void doService(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {
        // TODO Auto-generated method stub

        //该Servlet只处理具体的业务逻辑代码
    }
}


本文地址:http://linuxphp.cn/112.html
版权声明:本文为原创文章,版权归 小伙子 所有,欢迎分享本文,转载请保留出处!

发表评论


表情

还没有留言,还不快点抢沙发?