Java小白进阶之三---抽象类与接口的异同

         刚开始学Java的时候一直有点搞不清二者的区别,以为接口就是抽象类,抽象类就是接口。这几天自己看书,又参考了网上一些大牛的总结,然后自己也尝试着写了这篇总结(可能还会有不少遗漏之处,毕竟小白...)

先说什么是抽象类?
  • 抽象类(abstract class):用abstract修饰的类叫做抽象类。
    1. 抽象类无法被实例化,即不能new出对象;
    2. 用abstract修饰的方法叫做抽象方法,抽象方法需要定义在抽象类中;
    3. 含有抽象方法的类一定是抽象类,但抽象类中的方法不一定全部都是抽象方法(下面会提到原因
    4. 如果一个类继承了一个抽象类,那它必须实现抽象类中的所有抽象方法(注意这里写的是所有抽象方法而不是所有方法),否则该类也需要声明成abstract class

  • 接口(interface):因为Java规定了只能单继承,所以接口就是被设计出来用来间接实现多继承功能的(这也是我参考了大牛的看法加上自己的理解认为的)
    1. Java接口中的成员变量默认都是public static final类型的,必须被显示初始化,即接口中的成员变量为常量
    2. Java接口中的方法默认都是public abstract类型的,没有方法体
    3. Java接口中只能包含public static final类型的成员变量和 public abstract类型的成员方法
    4. 接口中没有构造方法,不能被实例化
    5. 接口可以多实现,即一个类可以同时实现好多个接口

下面开始正式说二者的异同:
  • 相同点:
    1. 抽象类和接口都属于抽象层;
    2. 都不能被实例化;
    3. 都包含抽象方法(这些方法是用来描述功能的,即系统可以提供什么服务,但不提供具体实现)

  • 不同点:(这一段摘自于大牛,因为个人语言组织水平暂时还不高)
    1. 在抽象类中可以为部分方法提供默认的实现(这里说明了抽象类中的方法不一定全是抽象方法),从而避免在子类中重复实现它们,这是抽象类的优势,但这一优势限制了多继承这句话刚开始真的把我看得晕得不行,后来才明白它是要和“接口的多实现”对比来说的,千万不要单独去看这句话)而接口中只能含有抽象方法。由于在抽象类中允许加入具体方法,因此扩展抽象类的功能,即向抽象类中增加新的具体方法,不会对它的子类造成影响。而对于接口,一旦接口被公布,就必须非常稳定,因为随意在接口中添加抽象方法,会影响到所有的实现类,这些实现类要么实现这些新增的方法,要么也声明为抽象类。
    2. 在Java中只能单继承,即一个类只能直接继承一个类(可能是抽象类),但Java中一个类可以实现多个接口,这是接口的优势。这一优势是以不允许为任何方法提供实现作为代价的。

使用接口和抽象类的总原则:
  1. 用接口作为系统与外界交互的窗口。站在外界使用者的角度(另一个系统)来说,接口向使用者承诺系统能提供哪些服务;站在系统本身的角度来说,接口制定系统必须实现哪些服务,接口是系统中最高层次的抽象类型。
通过接口交互可以提高两个系统之间的低耦合程度。(系统A通过系统B交互是指系统A访问系统B时,把引用变量声明为系统B的接口类型,该引用变量引用系统B中接口的实现类的实例);
  1. Java的接口本身必须非常稳定,接口一旦制定,就不能随便更改,否则会对外面使用者和系统本身造成影响;
  2. 用抽象类来制定系统中的扩展点(抽象类来完成部分实现,还要一些功能的话就通过它的子类实现)

你可能感兴趣的:(java,抽象类,接口)