文档介绍:8、abstractclass与interface有什么区别? 注:这个答案是我见过最详细答案含有abstract修饰符class即为抽象类,abstract类不能创建实例对象。含有abstract方法类必须定义为abstractclass,abstractclass类中方法不必是抽象。abstractclass类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果子类没有实现抽象父类中所有抽象方法,那么子类也必须定义为abstract类型。(我:很多子类应用都不用去实现每个抽象方法,所以适配器这个东西出现了)接口(interface)可以说成是抽象类一种特例,接口中所有方法都必须是抽象。接口中方法定义默认为publicabstract类型,接口中成员变量类型默认为publicstaticfinal。下面比较一下两者语法区别:,接口中不能有构造方法。,,接口中所有方法必须都是抽象,不能有非抽象普通方法。,protected与(默认类型,虽然eclipse下不报错,但应该也不行),但接口中抽象方法只能是public类型,并且默认即为publicabstract类型。,,抽象类中静态成员变量访问类型可以任意,但接口中定义变量只能是publicstaticfinal类型,并且默认即为publicstaticfinal类型。,但只能继承一个抽象类。 下面接着再说说两者在应用上区别:接口更多是在系统架构设计方面发挥作用,主要用于定义模块之间通信契约。而抽象类在代码实现方面发挥作用,可以实现代码重用,例如,模板方法设计模式是抽象类一个典型应用,假设某个项目所有Servlet类都要用相同方式进行权限判断、记录访问日志与处理异常,那么就可以定义一个抽象基类,让所有Servlet都继承这个抽象基类,在抽象基类service方法中完成权限判断、记录访问日志与处理异常代码,在各个子类中只是完成各自业务逻辑代码,伪代码如下:注:突然想起,普通类也可以实现这种模式啊?我答案:抽象类作用有两个:一,因为有些方法父类没办法或者不需要去实现,因为子类实现方式各有不同。这是在定义类时候就知道事情,所以父类去实现那个方法确实没有必要。二,有些父类方法必须要让子类去实现,这是规定,大家必须遵守!这个例子不错:publicabstractclassBaseServletextendsHttpServlet publicfinalvoidservice(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOExcetion,ServletException 记录访问日志进行权限判断if(具有权限) try doService(request,response); catch(Excetpione) 记录异常信息 protectedabstractvoiddoService(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOExcetion,ServletException;//注意访问权限定义成protected,显得既专业,又严谨,lassMyServlet1extendsBaseServletprotectedvoiddoService(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOExcetion,ServletException 本Servlet只处理具体业务逻辑代码父类方法中间某段代码不确定,留给子类干,就用模板方法设计模式。备注:这道题思路是先从总体解释抽象类与接口基本概念,然后再比较两者语法细节,最后再说两者应用区别。比较两者语法细节区别条理是:先从一个类中构造方法、普通成员变量与方法(包括抽象方法),静态变量与方法,继承性等6个方面逐一去比较回答,接着从第三者继承角度回答,特别是最后用了一个典型例子来展现自己深厚技术功底。我补充:3、ArrayList与Vector区别答:这两个类都实现了List接口(List接口继承了Collection接口),他们都是有序集合,即存储在这两个集合中元素位置都是有顺序,相当于一种动态数组,我们以后可以按位置索引号取出某个元素,,并且其中数据是允许重复,这是HashSet之类集合最大不同