Java中接口(interface)和抽象类(abstract class)的区别

接口(interface)和抽象类(abstract class)是支持抽象类定义的两种不同机制

一、接口(interface)

接口通过关键字interface实现,是公开的,不能有私有方法和变量,接口中的所有方法都只有方法定义,没有方法体。

二、抽象类(abstract)

通过将类或类中的方法声明为关键字abstract修饰,从而来表示这个类是抽象类,抽象类中的抽象方法用abstract修饰,只有方法的定义,不能含有方法体。抽象类中可以定义私有的变量和方法,子类必须实现抽象类的所有抽象方法,否则子类也是抽象类,子类的实现方法必须含有相同的或者更低的访问级别(public->protected->private)

 

小结:接口可以看成是抽象类的另一种方式,接口中的所有方法都是抽象方法,可以通过接口实现多重继承,接口中的成员变量默认是static final类型的;抽象类可以有私有变量和方法实现。

三、相同点和不同点

(1)、相同点

  1. 都不能被实例化;
  2. 接口的实现类或抽象类的子类只有实现了所有抽象方法才能被实例化。

(2)、不同点

  1. 方法定义与实现。接口中只有方法的定义,不能有方法的实现;抽象类中可以定义方法和实现,非抽象方法可以在抽象类中实现。
  2. 多态特性。一个接口可以通过extends继承多个接口,接口实现通过关键字implements,一个实现类可以实现多个接口;子类只能通过extends继承一个抽象类,所以使用接口可以实现多重继承;
  3. 关系不同。接口强调特定功能的实现,抽象类强调所属关系;
  4. 定义不同。接口中的所有方法默认是public abstract修饰,不含有方法体,成员变量默认是public static final的,必须赋初值;抽象类的抽象方法被abstract修饰,不能被static、private、final、synchronized和native等修饰,不含有方法体,成员变量默认是default,可在子类中重新定义或赋值;
  5. 使用范围。接口多用于常用的功能定义,便于日后维护,抽象类倾向于公共类的角色,不便于日后的维护和功能修改。功能需要累积时用抽象类,不需要累积时用接口。

四、特点

(1)、接口(interface)的特点

  1. 接口中的方法默认是被public修饰,只有方法定义,不能有方法实现;
  2. 如果修饰符是public。则该接口在整个项目中可见 ,如果省略public修饰符 则该接口只能在该包可见
  3. 接口中没有构造方法,不能实例化接口对象;
  4. 接口中只能定义常量,若定义变量,在编译的时候都会默认是public static final
  5. 接口中定义的方法由实现类实现,如果实现类没有实现接口中的全部方法,则该实现类需要定义为抽象类;
  6. 接口中可以定义和实现静态方法,由于静态方法不能被实现类重写,一般不建议在接口中定义静态方法;
  7. 接口可以实现继承多个接口,但接口不能继承类
  8. 接口本身也是一种数据类型
  9. 一个类只能有一个直接父类,但可以通过implements实现多个接口,当类在继承父类的同时有实现了多个接口时,extends关键字必须位于implements关键字之前

(2)、抽象类(abstract class)的特点

  1. 如果一个类中含有抽象方法,这个类就必须定义为抽象类;
  2. 抽象类中可以没有抽象方法;
  3. 抽象类中可以含有普通属性和方法,构造方法和抽象方法;
  4. 抽象类中的抽象方法必须有子类全部实现,否则子类也需要定义为抽象类;
  5. 抽象类和抽象方法都被abstract修饰,不能被static、private、final、synchronized和native等修饰;
  6. 抽象方法不能同new初始化对象;
  7. 如果要使用抽象类,必须由子类实现全部的抽象方法,通过实例化子类使用。