接口和类
引导故事
从前有一个国家,国王深知知识改变命运,决定:全国修建学校,要求:一名有建校资质的校长。有一名具备建校资质的校长才能称为学校,领取国家补助;没有一名建校资质的校长不能称为学校,不能领取国家补助。
在引导故事中:类对应学校,校长可以称之为接口、抽象类。
接口 和 抽象类
在某种程度上,接口可以称为规范,抽象类可以称为模板。接口相较抽象类更加灵活。
使用学校模板可以创建学校,只是创建的学校细节不一致。举例:A学校是一马路小学,B学校是中央路小学。
接口示例
// 学校建立条件<规范>
public interface SchoolCondition {
boolean haveHeadMaster();
}
// 抽象类,学校模板
public abstract class SchoolTemplate implements SchoolCondition {
}
注意
- 由于java支持单继承、多实现,且自从java 8 中出现缺省方法,推荐使用接口定义规范。
- 接口应当用来定义类型,不应该用来导出常量。
类
在引申故事模型中,类对应学校。
封装
封装是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问,保证只能有指定方法名<set方法或者其他方法>才可以访问类内部属性或方法。
注意:封装保证对象中属性变更可感知:在set方法添加监听自定义逻辑。
类继承
继承虽然是优秀的机制,但是违背了封装原则。
java中支持类的继承,子类可以继承父类的属性和方法,不过由于访问权限修饰符限制,无法使用特定属性和方法。
注意:类继承是代码重用的一种方式,但不是最佳方式。
访问权限限制
java中四种访问权限修饰符:private、default、protected、public。
使用访问权限修饰符限制子类调用父类的属性和方法。
可变性最小化
使用final关键字保证类中的属性、方法不会被篡改、重写。
复合优先于继承
理由:子类继承父类是为了使用父类方法,父类的版本升级可能导致子类的不可用。
总结:继承的目标是使用继承类的方法,在现有类中添加继承类的一个实例,也可以使用继承类方法,这就是复合。也可以称为转发。
注意
- 支持继承的类必须有文档,否则不要继承。
- 使用嵌套类时,静态成员类优于非静态成员类。
- 永远不要将多个顶级类放在一个源文件中。