封装:
封装指的信息的隐藏,也就是说隐藏一些实现的细节,对外提供相应的方法或者接口。
封装的主要目的就是降低代码的耦合度,使代码模块化。比如在面向对象中对一个实体的封装就是用变量来描述他的属性,用方法来定义行为,封装成一个类。
抽象:
提取事物的一些共性,将他们归为一个类。也就是说只关注相同点,而忽略具体的实现细节。依赖反转也提出了抽象不应该依赖于细节,而细节应该依赖于抽象,意思就是要我们考虑如何针对抽象或者接口编程,而不是细节。在Java中使用abstract来定义抽象类。与接口主要的不同点是:
抽象类可以有普通方法,普通成员变量,构造函数,和静态方法,而接口不能有。
抽象类的方法访问属性可以是public protected 和 默认 但接口只能是public
都能包含静态成员变量,但是接口的类型只能是public static final型。
继承:
指的是在定义一个类的时候,可以在另一个类的基础上来进行,因此也拥有那个类的非private访问类型的属性和方法,提高了代码的复用性。但是因为可以重写父类的一些具体实现,所以破坏了父类的封装性。然后由于继承关系是在编译期间就确定了,所以对父类做的一些改变必然会影响到子类,依赖性过大。因此在代码复用以及耦合的角度上来看,使用组合更加合适,组合指的是在一个类的内部持有另一个接口的对象。因为是持有对象,所以保护了封装性,又因为持有的是一个接口的对象,所以是在运行期间才会确定具体的持有对象,大大降低了依赖性。但是设计中如果要使用到多态的话,那就需要选择继承而不是组合了。
多态:
首先多态实现是机制就是父类或者接口的引用可以指向他的子类或者实现类。也就是说父类能new出子类,接口能new出接口的实现类。所以在编译期间,不能确定一个引用变量具体会指向哪一个类,只有在运行期间才会动态绑定。多态用到的地方很多,比如经常用到的集合类(list map...),Spring中的ioc,泛型,设计模式中的简单工厂模式,策略模式,和组合。