有时候定义父类时,只是知道子类包含方法,但无法准确知道子类如何实现这些方法 ,就需要定义一个抽象类。
方法功能声明相同,但方法功能主体不同。那么这时也可以抽取,但只抽取方法声明,不抽取方法主体。那么此方法就是一个抽象方法。
当定义了抽象函数的类也必须被abstract关键字修饰,被abstract关键字修饰的类是抽象类。
定义格式:
抽象类定义 abstract class 类名{ } 抽象方法定义 public abstract 返回值类型 方法名(参数){ }
抽象类的特点:
抽象类和抽象方法都需要被abstract修饰,抽象方法一定要定义在抽象类中。
抽象类不可以直接创建对象,调用抽象方法没有意义。
只有覆盖抽象类中所有抽象方法后,子类才可以创建对象,否则子类还是抽象类
继承抽象类是面对共性类型操作会更简单
抽象类的细节问题
抽象类一定是一个父类
抽象类的子类可以不定义抽象方法
抽象关键字不可以和private(私有的方法子类无法继承)、final常量无法改变、static静态,同时使用。
接口:
接口是功能的集合,是比抽象类更抽象的“类”
接口只描述应该具备的方法,并没有具体实现,具体的实现由接口的实现类完成,这样将功能的定义与实现分离,优化了程序设计。
一切事物皆有功能,即一切事物皆有接口。
定义:
接口定义需要使用interface关键字代替class
接口中方法均为公共访问的抽象方法,接口中无法定义普通的成员变量。
类实现接口
创建类使用关键字implement,在类实现接口后,该类就会将接口中的抽象方法继承过来,该类需要重写抽象方法。
接口中成员的特点
接口中可以定义变量,必须有固定的修饰符,final常量
接口中可以定义方法,固定修饰符abstract
接口不能创建对象
子类必须覆盖接口中所有抽象方法后,子类才可以实例化,否则就是抽象类。
接口的多实现:
接口之间可以同时继承和实现接口,避免了单继承的局限性
接口的多继承:
多个接口之间可以使用extends继承
接口在开发中的好处:
接口的出现扩展了功能
接口就是暴露出来的规则
接口出现降低了耦合性,实现了解耦
接口和抽象的区别:
抽象类为部分方法提供实现,避免子类重复实现,提高代码重用性;接口只能包含抽象方法。
一个类只能继承一个直接父类,却可以实现多个接口;
抽象类是这个事物中应该具备的内容,继承体系是 is a 关系
接口是这个事物额外的内容,继承体系是 like a 关系
二者优先选用接口,需要定义子类行为,又要为子类提供共性功能时才选用抽象类。