一、抽象
抽象方法只有方法签名不能写方法体代码,且抽象方法对应的类也要对应为抽象的;
抽象类可以理解为不完整的,当某个父类知道子类一定要完成某个行为,但是它们的行为实现又不同,父类就将该行为定义为抽象方法的形式,交给子类完成
注意:
一个类如果继承抽象类,那么这个类一定要重写抽象类的所有抽象方法,否则这个类也要被定义为抽象类。
抽象类中可以没有抽象方法,有抽象类方法的一定是抽象类。
不能用abstract修饰变量,代码块,构造器
得到了抽象方法,失去了创建对象的能力
因为加入抽象类可以创建对象,那么这个对象的方法实现连方法体都没有,或者不知道该如何执行哪个子类的方法
final和abstract是互斥关系
抽象类:模板方法模式:
将功能定义成一个所谓的模板方法,放在抽象类中,模板方法中只定义通用且能确定的代码
不能决定的功能定义成抽象方法让具体子类去实现
建议用final修饰模板方法,因为它不应该被子类重写,这样更容易防止子类重写,更安全
就像LAB2中的图一样,只不过LAB2中只有创建图是公用的于是在Graph类中就直接用了edge或者vertices的一种实现,其他的方法比如add,remove等等,由于两种实现的内部数据结构不同,就要交给子类去实现,但Graph也算是一种抽象方法模式。
LAB2的模板方法模式提高了代码的复用性,减少了重复代码的使用。
二、接口(一种规范)
接口中的成分特点:JDK8之前只能有抽象方法和常量:
接口是一种规范思想,所以里面的方法和常量应该是公开的,且可以省略不写,系统会默认公开
接口是用来被实现的(实现类),可以理解为所谓的子类,格式:
修饰符 class 实现类 implements 接口1,接口2,接口3,...{
}
接口可以被类单实现,也可以被多实现,如LAB2中的利用边和点两种形式来实现Graph
接口实现的注意事项:一个类实现接口,必须重写完接口的全部抽象方法,否则这个类需要定义成抽象类
类和类的关系:单继承
类和接口的关系:多实现
接口和接口的关系:多继承,一个接口可以同时继承多个接口
接口多继承的作用:规范合并,整合多个接口为同一个接口,便于子类实现
JDK8以后允许接口中直接带有方法体的方法
类型:默认方法:类似普通实例方法,必须要用default修饰,默认用了public修饰,要用实现类的对象来调用
静态方法:必须要用static修饰,默认会public修饰,接口的静态方法必须用本身的接口名称调用例如Graph中的empty方法