抽象类
- 抽象类用abstract声明,抽象类不可以直接实例化,但是可以实例化抽象类的子类,
- 抽象类可以包含抽象方法也可以包含抽象方法,抽象方法不需要具体实现
- 只是一个占位作用,需要由其子类去实现,抽象类非常适合于模板方法模式。
- 子类中的抽象方法不能与父类的抽象方法同名
- abstract不能与final并列修饰同一个类
- abstract 不能与private、static、final或native并列修饰同一个方法
接口
首先接口不是类,接口是对类的一组需求的描述,是一种对行为的抽象,要求实现类遵守接口定义的规范来进行描述。
- 接口中的方法自动属于public
- 接口中可以包含常量,常量自动属于public static final
- 一个接口可以继承多个接口
- 一个类可以实现多个接口
- 接口中可以有多个static方法,static方法由接口直接调用,不能被实现
- 接口中可以增加写default方法,default方法是接口定义的方法默认的实现,实现类如果实现了这个方法那么调用实现类的,没有实现就调用这个默认的,default不是强制实现的,所以这个可以解决一个接口发布之后,新增加功能的时候导致旧的实现类无法编译的问题。
为什么有了抽象类还要有接口呢?
从语法的角度看
- 接口是对一类行为的抽象,一个类可以实现多个接口,但是类只能继承一个抽象类,这样如果一个类需要满足多种抽象特征的时候,抽象类就不能满足需求了。但是类却可以实现多个接口来达到这个目的,非常方便类的拓展。
从设计理念看
- 抽象类用于继承,继承解决的是一类事务具有相同的特征,这些特征可以抽象出来,作为一个公共特征,这个具有公共特征的类就是父类,子类可以继承父类的这些公共特征,也可以对这些公共特征进行稍微的修改,父类和子类其实是同类事务,并且存在一定的关系。比如鸟类和燕子,他们都具有一个共同特征可以飞,那么要表示鸟类和燕子的关系那么就适合使用继承关系。抽象类在这种继承模式下可以重新出很多公共代码,用于复用,极大提高了代码的复用性.
- 接口描述的是一类行为规则,定义的是一系列的行为,比如鸟类和飞机都能够飞,那么飞行就是他们共同的行为,我们可以定义这样一个Fly接口,这个接口用来描述飞行的行为,所有能够飞行的事物都可以实现这个接口,但是他们之间并不存在什么父子关系。