接口和抽象类的使用


使用接口类的原则:

  1. 接口必须有子类,子类依靠implements关键字可以同时实现多个接口。
  2. 接口的子类(如果不是抽象类)必须实现接口中的全部抽象方法,才能实现实例化对象。
  3. 利用子类实现对象的实例化,接口可以实现多态性。
  4. 接口类除了数据成员(赋初值且值不可更改,关键字final可以省略),还有抽象方法(关键字abstract可以省略)和 default方法。

使用抽象类的原则:

  1. 抽象类和抽象方法都必须用abstract关键字来修饰
  2. 抽象类必须有子类,子类使用extends继承抽象类,一个子类只能够继承一个抽象类
  3. 抽象类不能直接实例化,也就是不能直接用new关键字去产生对象
  4. 在抽象类中,定义时抽象方法只需声明,而无需实现(没有方法体)
  5. 含有抽象方法的类必须被声明为抽象类,抽象类的子类必须实现所有的抽象方法后,才能不叫抽象类,从而可以被实例化,否则这个子类还是抽象类
  6. 抽象类不能够使用final定义,因为使用final定义的类不能有子类,而抽象类使用的时候必须有子类,所以容易出现矛盾现象。
  7. 如果要想实例化抽象类的对象,则可以通过子类进行对象的向上转型来完成。
  8. 和普通类相同,抽象类可以拥有构造方法,但是这些构造方法必须在子类中被调用,并且子类实例化对象的时候依然满足被继承的关系,先默认调用父类的构造方法,而后再调用子类的构造方法,毕竟抽象类之宗还是存在属性的,但抽象类的构造方法无法被外部类实例化对象调用。

接口和抽象类相比,主要区别就在于“子类”上,子类的继承体系中,永远只有一个父类,但子类却可以同时实现多个接口,变相完成“多继承”。

Java之所以禁止多继承,就是想避免类似的二义性。

在“变相”实现的多继承中,如果说在一个子类中既要实现接口又要继承抽象类,则应采用先继承后实现的顺序完成。

继承一个抽象类和继承一个普通类的主要区别:

  1. 在普通类之中所有的方法都是由方法体的,如果说有一些方法希望由子类实现的时候,子类即使不实现,也不会出现错误。而如果重写改写了父类的同名方法,就是构成了“重写”。
  2. 如果使用抽象类的话,那么抽象类中的所有抽象方法在语法规则上就必须要求子类全部实现,这样就可以强制子类做一些固定操作。