包含abstract修饰符的class即为抽象类,抽象类不能创建实例对象,含有abstract方法的类必须为定义为abstract class
抽象类中的方法不必都是抽象的,抽象类中定义的抽象方法必须是在具体的子类中进行实现,所以不能有抽象的构造犯法或抽象的静态方法.
应用上的区别: 接口主要是在系统架构设计方面发挥作用,用于定义模块之间的通信契约
抽象类主要是在代码实现方面发挥作用,可以实现代码的重用;例如模板方法设计模式是抽象类的一个典型应用
假设项目中所有Servlet类都要用相同的方式进行权限判断,记录访问日志和处理异常的代码,在各个子类中完成各自的业务逻辑代码,伪码如下:
父类方法中间的某段代码不确定,留给子类去实现,就用模板方法设计模式
抽象类中的方法不必都是抽象的,抽象类中定义的抽象方法必须是在具体的子类中进行实现,所以不能有抽象的构造犯法或抽象的静态方法.
如果子类没有实现父类所有的抽象方法,那么子类也必须是抽象的 抽象类的方法不能同时带有 static, native, synchronized
语法上的区别:
抽象类 | 接口 | |
---|---|---|
构造方法 | 可以有 | 不能有 |
普通成员变量 | 可以有 | 不能有 |
非抽象普通方法 | 可以有 | 不能有,所有方法都是抽象的 |
抽象方法访问类型 | public,protected | 只能是public |
静态方法 | 可以有 | 不能有 |
静态成员变量 | 有,访问类型全部 | 有,访问类型public |
子类数量 | 一个 | 多个 |
抽象类主要是在代码实现方面发挥作用,可以实现代码的重用;例如模板方法设计模式是抽象类的一个典型应用
假设项目中所有Servlet类都要用相同的方式进行权限判断,记录访问日志和处理异常的代码,在各个子类中完成各自的业务逻辑代码,伪码如下:
public abstract class BaseServlet extends HttpServlet {
public final void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{
//记录访问日志
//进行权限判断
if(具有权限) {
try {
doService(request, response);
} catch(Exception e) {
//记录异常信息
}
}
}
protected abstract doService(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
// 注意访问权限定义成protected,显得专业严谨,因为这个方法只专门留给子类使用的
}
}
public class MyServlet extends BaseServlet {
@Override
protected void doService(HttpServletRequest requeest, HttpServletResponse response) throws IOException, ServletException {
//指出里具体的业务逻辑代码
}
}
父类方法中间的某段代码不确定,留给子类去实现,就用模板方法设计模式