面向对象设计的原则
1、针对接口编程,而不是针对实现编程
2、优先使用对象组合,而不是类继承
继承
当子类继承父类时,子类包含了父类定义的所有数据和操作,子类的实例包含了所有子类和父类定义的数据,并且能完成子类和父类定义的所有操作。
类继承是通过复用父类功能而扩展应用功能的基本机制。
父类的访问权限问题:(Java编程思想P116)
1、子类不能访问父类的private修饰的成员;
2、子类与父类不在同一个包中,子类不能访问父类包访问权限修饰的成员;
3、子类与父类在不同的包中,子类可以访问父类中被protected修饰的成员。
抽象类
抽象类的目的是为它的子类定义公共接口
接口
接口就是对象能响应的请求的集合(public修饰的方法)。因此接口中定义的方法都是publict和abstract的,且都可以省略。(接口中定义的数据都是public static final的)
根据接口来操纵对象的好处:
1、客户无须知道所使用对象的特定类型,只须对象有客户所期望的接口;
2、客户无须知道所使用对象是用什么类型实现的,只须知道定义接口的抽象类。
不将变量声明为某个特定的具体类的实例对象,而是让它遵从抽象类所定义的接口。极大减少系统实现之间的相互依赖关系。
组合
通过获得对其他对象的引用而在运行时刻动态定义。组合要求对象遵守彼此的接口约定。
因为对象只能通过接口访问,所以并不会破坏封装性,只要类型一致,运行时还可以用一个对象来代替另一个对象。对象的实现是基于接口编写的,所以存在较少的依赖关系。
继承和组合的比较
1、继承是在编译时静态定义的,组合是在运行时刻动态绑定的
2、继承在编译时刻就定义了,因此运行时刻无法改变从父类继承的实现,父类实现中的任何变化必然导致子类发生变化。
多态(动态绑定、后期绑定、运行时绑定)
不同对象可能对相同请求有不同的实现。
接口与其功能的实现是分离的,因此不同对象可以对请求做不同的实现。也就是两个相同接口的对象可以有完全不同的实现。
动态绑定:发送给对象的请求与相应操作在运行时连接
持有父类或接口类型的引用,在运行进连接具体对象(子类或实现接口的实例)