封装特性
个人认为封装特性应该是面向对象编程中最难的一个特性。大到一个系统的构成,比方说这个系统应该有多少个服务,每个服务应该有哪些模块,每个模块应该有哪些对象,这里其实强调的是一个系统边界划分的问题,当然也是封装问题。还有,小到一个对象应该有哪些属性,哪些方法,这些对象,属性和方法分别使用什么样的访问修饰符进行定义,它们的可见范围是怎样的,这都是封装特性。生活中大到国家有多个省份,每个省份有多少个地市,每个地市有多少个区县。小到一个公司有多少个事业部,每个事业部有哪些成员,每个成员都有什么特征(个头高,帅气,漂亮),什么行为(做事,说话,跳舞,唱歌),这也都是封装。在Java编程过程中,我们知道MyBatis实现了对JDBC操作数据库这个过程的封装,Spring封装了对象的创建,依赖注入的过程,SpringBoot封装了很多的基础配置,实现了开箱即用的特性,Spring Cloud 封装了一种服务治理的思想,例如如何实现服务注册,发现,调用,配置等。当然程序中的每个对象也都有自己的特性和行为,例如线程对象封装了执行任务的的特性和方法,IO对象封装了读写内存,磁盘,网络数据方式等等,这些都是封装特性。
继承特性
Java中的继承特性是程序中实现代码的复用的一种方式,也是它最大的优势,实际编程中我们通常将共性写到父类中,特性写到子类中,当然子类也可以进行自己的扩展。这种继承关系可以看成是一种is a的关系,例如class Circle extends Shape{}表示圆形(Circle)是一个图形(Shape),class Dog extends Animal{}表示狗(Dog)是一个动物(Animal)。在Java中类的继承可以是多层,但不能是多重,即一个子类不能有多个直接的父类,子类可以继承父类所有属性和方法,但私有属性和方法不能直接访问。子类可以基于业务重写父类可见方法,以实现功能拓展。我们也可以在子类构造方法内部通过super(参数列表)调用父类构造方法和super.xxx的方式调用父类的成员。在实际应用中继承关系是一种强耦合关系,继承关系层次最好不要多于三层,否则可能难于维护。
多态特性
多态是对对象行为的一种描述,在java中基于封装和继承特性,定义了编译时多态和运行时多态。编译时的多态就是方法的重载(方法名相同,参数列表不同),运行时的多态是基于继承特性实现的一种重写。本质上就是把做什么和具体怎么做分开了,例如我们定义了要做什么,但具体怎么做完全取决于具体的对象。例如睡觉是一种行为,但是有的人睡觉时磨牙,有的人说梦话,有的人打呼噜,有的人梦游。同样,吃饭也是一种行为,有的人吃饭细嚼慢咽,有的人狼吞虎咽。在程序中我们通常将多态特性应用在方法的返回值和参数类型上,方法的返回值和参数类型能用抽象则用抽象,便于后于进行多态拓展。