目录

抽象类

概念

简单来说,含有抽象方法的类就是抽象类,抽象方法是只有方法体,没有实现,使用abstract修饰。

abstract class AbsClass { abstract void say(); } 

特点

  • 抽象类必须用abstract修饰,由于抽象类中没有具体实现的方法,所以抽象类不能被实例化。
  • 抽象类还可以存在普通属性,方法,静态属性和方法。
  • 抽象类可以有构造方法。
  • 抽象方法前不可以使用private,static,synchronzied,native修饰符修饰。

接口

概念

接口就是封装了一定功能的集合,对一类行为的抽象,使用interface修饰。

public interface InfClass { public void say(); } 

特点

  • 接口中只有方法声明,没有方法体。
  • 接口中只有常量,因为编译时,会默认加上public static final。
  • 接口中没有构造方法,由于方法只有方法体,所以也不饿能被实例化。
  • 如果一个类实现了接口,必须实现接口中的所有方法,不然这个类就要声明为抽象类。

抽象类和接口的区别

  • 语法区别
    • 抽象类可以有构造方法,接口不可以有构造方法。
    • 抽象类可以同时包含抽象和非抽象方法,接口中所有的方法隐含的都是抽象的。
    • 抽象类可以包含非final的变量,接口中声明的变量默认都是public static final的。
    • 抽象类的抽象方法可以是protected或者是public,接口中抽象方法默认是public的。
    • 抽象类可以包含静态方法和静态代码块,接口中不可以有静态方法和静态代码块。
    • 类可以实现多个接口,但是只能继承一个抽象类。
  • 应用区别
    • 抽象类主要应用在代码实现,提高了代码的可重用性,比如说,一个项目的Servlet类都要用相同的方式实现权限判断,处理异常,就可以抽象一个抽象基类,抽象基类中去实现这些相同的功能。接口主要应用在系统架构设计上,用于定义模块之间的通信契约,比如说,Java开发中,DAO层都是使用接口,对类的行为进行封装。
  • 设计层面
    • 抽象类是一种模板式设计。而接口是一种行为规范,是一种辐射式设计。模板式设计就是如果需要添加新的方法,可以直接在抽象类中添加具体的实现,子类可以不进行变更;辐射式设计就是如果接口进行了变更,则所有实现这个接口的类都必须进行相应的改动。
    • 抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。