面向过程让计算机有步骤地顺序作一件事,是过程化思惟,使用面向过程语言开发大型项目,软件复用和维护存在很大问题,模块之间耦合严重。面向对象相对面向过程更适合解决规模较大的问题,能够拆解问题复杂度,对现实事物进行抽象并映射为开发对象,更接近人的思惟。spa
例如开门这个动做,面向过程是 open(Door door),动宾结构,door 做为操做对象的参数传入方法,方法内定义开门的具体步骤。面向对象的方式首先会定义一个类 Door,抽象出门的属性(如尺寸、颜色)和行为(如 open 和 close),主谓结构。日志
面向过程代码松散,强调流程化解决问题。面向对象代码强调高内聚、低耦合,先抽象模型定义共性行为,再解决实际问题。对象
封装是对象功能内聚的表现形式,在抽象基础上决定信息是否公开及公开等级,核心问题是以什么方式暴漏哪些信息。主要任务是对属性、数据、敏感行为实现隐藏,对属性的访问和修改必须经过公共接口实现。封装使对象关系变得简单,下降了代码耦合度,方便维护。一般,应禁止直接访问一个对象中数据的实际表示,而应经过操做接口来访问,这称为信息隐藏。继承
迪米特原则就是对封装的要求,即 A 模块使用 B 模块的某接口行为,对 B 模块中除此行为外的其余信息知道得应尽量少。不直接对 public 属性进行读取和修改而使用 getter/setter 方法是由于假设想在修改属性时进行权限控制、日志记录等操做,在直接访问属性的状况下没法实现。若是将 public 的属性和行为修改成 private 通常依赖模块都会报错,所以不知道使用哪一种权限时应优先使用 private。接口
继承用来扩展一个类,子类可继承父类的部分属性和行为使模块具备复用性。继承是"is-a"关系,可以使用里氏替换原则判断是否知足"is-a"关系,即任何父类出现的地方子类均可以出现。若是父类引用直接使用子类引用来代替且能够正确编译并执行,输出结果符合子类场景预期,那么说明两个类符合里氏替换原则。ci
多态以封装和继承为基础,根据运行时对象实际类型使同一行为具备不一样表现形式。多态指在编译层面没法肯定最终调用的方法体,在运行期由 JVM 动态绑定,调用合适的重写方法。因为重载属于静态绑定,本质上重载结果是彻底不一样的方法,所以多态通常专指重写。开发
重载指方法名称相同,但参数类型个数不一样,是行为水平方向不一样实现。对编译器来讲,方法名称和参数列表组成了一个惟一键,称为方法签名,JVM 经过方法签名决定调用哪一种重载方法。无论继承关系如何复杂,重载在编译时能够根据规则知道调用哪一种目标方法,所以属于静态绑定。get
重写指子类实现接口或继承父类时,保持方法签名彻底相同,实现不一样方法体,是行为垂直方向不一样实现。编译器
元空间有一个方法表保存方法信息,若是子类重写了父类的方法,则方法表中的方法引用会指向子类实现。父类引用执行子类方法时没法调用子类存在而父类不存在的方法。权限控制
类关系 | 描述 | 权力强侧 | 举例 |
继承 | 父子类之间的关系:is-a | 父类 | 小狗继承于动物 |
实现 | 接口和实现类之间的关系:can-do | 接口 | 小狗实现了狗叫接口 |
组合 | 比聚合更强的关系:contains-a | 总体 | 头是身体的一部分 |
聚合 | 暂时组装的关系:has-a | 组装方 | 小狗和绳子是暂时的聚合关系 |
依赖 | 一个类用到另外一个:depends-a | 被依赖方 | 人养小狗,人依赖于小狗 |
关联 | 平等的使用关系:links-a | 平等 | 人使用卡消费,卡能够提取人的信息 |