对于面向对象的程序设计有三大特性:
1.封装性
封装主要有两层含义:其中第一层含义:把对象的属性以及行为看成一个不可分割的整体,将这二者封装到一个不可在分割的独立的单元(对象)中;另外一层含义是指对信息的隐藏,把不需要让外界知道的信息隐藏起来,有些对象的属性以及行为是允许让外界知道的,但是不允许更改,而另一些属性以及行为是不允许外界知道的,或者只允许外界使用对象的某一些功能,而尽可能的隐藏对象的功能的实现细节。
2.继承性
继承是面向对象思想的一个重要的概念。是提高软件开发效率的一个重要的手段。
首先要拥有一个可以表现一般特性类,然后在这个类的基础上派生出反应特殊事务的类。
在Java程序中,已经存在的这个反应一般事务的类,我们称之为父类(基类或者超类),在其基础上派生出来的反应特殊事务的类,我们称之为子类(派生类)。根据继承的机制,子类会继承父类全部的属性以及行为,子类可以添加自己所特有的一些属性以及行为。

如果一个子类可以继承多个父类,我们称之为多继承。如果一个子类只能继承一个父类,称之为单继承。我们的Java程序语言是单继承语言。Java为了弥补单继承带来的局限,采用接口来弥补不能同时继承多个父类带来的缺点。
3.多态性
多态面向对象程序设计的一个重要的特征。多态是允许程序中出现重名的现象。Java语言中有方法的重载以及对象的多种形态的多态。
多态:一种事物的多种表现形态。
类与对象的关系
在面向对象中,类和对象都是最基本、最重要的组成单元。类实际上是表示一个客观世界某类群体的一些基本特征的抽象。对象是表示一个具体的东西。
五大基本原则:SPR, OCP, LSP, DIP, ISP
参考资料:https://www.cnblogs.com/corvoh/p/5747856.html
单一职责原则SRP(Single Responsibility Principle)
是指一个类的功能要单一,不能包罗万象。如同一个人一样,分配的工作不能太多,否则一天到晚虽然忙忙碌碌的,但效率却高不起来。

开放封闭原则OCP(Open-Close Principle)
一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。比如:一个网络模块,原来只服务端功能,而现在要加入客户端功能,那么应当在不用修改服务端功能代码的前提下,就能够增加客户端功能的实现代码,这要求在设计之初,就应当将服务端和客户端分开,公共部分抽象出来。

里式替换原则LSP(the Liskov Substitution Principle LSP)
子类应当可以替换父类并出现在父类能够出现的任何地方。比如:公司搞年度晚会,所有员工可以参加抽奖,那么不管是老员工还是新员工,也不管是总部员工还是外派员工,都应当可以参加抽奖,否则这公司就不和谐了。

依赖倒置原则DIP(the Dependency Inversion Principle DIP)
具体依赖抽象,上层依赖下层。假设B是较A低的模块,但B需要使用到A的功能,这个时候,B不应当直接使用A中的具体类: 而应当由B定义一抽象接口,并由A来实现这个抽象接口,B只使用这个抽象接口:这样就达到了依赖倒置的目的,B也解除了对A的依赖,反过来是A依赖于B定义的抽象接口。通过上层模块难以避免依赖下层模块,假如B也直接依赖A的实现,那么就可能 造成循环依赖。一个常见的问题就是编译A模块时需要直接包含到B模块的cpp文件,而编译B时同样要直接包含到A的cpp文件。

接口分离原则ISP(the Interface Segregation Principle ISP)
模块间要通过抽象接口隔离开,而不是通过具体的类强耦合起来