封装把接口与实现相分离,隐藏了实现的细节。继承允许了类把对象视为自己本身或者是父类就行处理的能力。而多态描述了同一对象对不同消息做出不同的反应。分离了做什么和怎么做。
多态的必要条件:继承树,java默认的虚方法,向虚方法发送消息,虚方法在子类中被覆盖。
java的基本特性之一就是动态绑定,动态绑定就是在执行的时候才把方法名和对应的代码相关联,能够动态绑定的方法也就是虚方法,也是多态的必要条件,有了动态绑定才能够在使用父类的引用根据实例的不同做出不同的反应。
例如:
这样一个draw方法就能够画所有的图形了,如果没有多态的这种性质,可能我们需要的就是drawTri(),drawSqu()等多个方法,特别是当我们需要扩展新的形状是还得添加新的方法。
抽象方法和抽象类
在使用多态的方式的时候,我们发现基类中的方法没有任何的实际意义,只是为了提供一个动态绑定调用的接口形式。因此这个方法可以使只有形参没有内容的方法,我们称之为抽象方法,
含有抽象方法的类就必须命名为抽象类用abstract来定义。
抽象类中可以有其他一切正常的方法
继承了抽象类的派生类必须实现对应的抽象方法。
接口
比抽象类更加的抽象了,只有虚方法,除了虚方法以外的数据默认都是static,final类型的。接口支持多重继承。
除了用接口能够解决java的多重继承外,抽象类与接口在设计意义上还是有差别的。
抽象类作为基类始终表示的is-a的关系。其中的方法应该符合ICP原则是这个类型固有的行为。
而接口则表示的是has-a的关系,表示的是一种扩展,比如需要给一个对象增加新的功能,就需要使用接口了,接口提供的是这个类具有哪些的行为。具体区别在这里