1.面向对象的三大特性
1)封装(Encapsulation)
隐藏对象的具体实现细节,通过共有方法暴露对象的功能。
内部结构可以自由修改,同时可对成员进行更加精确的控制
(比如在setter方法中加值合法判断)
2)继承(Inheritance)
使用已经存在的类作为基础类(父类),在此基础上建立新类(子类),子类既可复用父类的功能,也能进行扩展,从而实现代码复用。
另外,Java不能像C++那样同时继承多个父类,只能树形的继承,
比如:Man -> Human -> Animal,或通过接口和内部类实现多继承。
另外,关于继承还需注意以下几点:
- 1.子类拥有父类非private的属性与方法
- 2.构造方法只能调用,不能实现,子类默认调用父类的无参构造方法,
如果父类没有无参的构造方法,需要使用super显式调用! - 3.慎用继承,要考虑是否需要从子类向父类进行向上转型!
3)多态(Polymorphism)
定义:一个类实例的相同方法在不同的情形下有不同的表现形式
分为以下两种:
- 编译时多态(OverLoading)—— 方法重载
- 运行时多态(OverRidding)—— 继承 + 方法重写 + 向上转型(父类引用指向子类对象)
运行时多态(动态绑定,new后面什么类型,动态类型就是什么类型)
示例如下:
2.类与类间的关系
口诀:鸡湿衣冠剧组(继承,实现,依赖,关联,聚合,组合)
继承和实现就不说了,后面四个只是 语意层次 的区别
两个类的相关程度,依赖 < 关联 < 聚合 < 组合
依次的UML类图标记:
· 继承/泛化(Generalization): 子类父类
· 实现(Realization):实现类 接口
· 依赖(Dependency):不持有引用,具体表现:局部变量,函数参数,
返回值使用 依赖类,比如大佬依赖于递茶小弟;
关联(Association):持有引用,具体表现:成员变量,
箭头指向被关联类,可双向,一对多或多对多:
聚合(Aggregation):成员变量,关联是处于同一层次的,而聚合则
是整体和局部层次的,比如:社团 和 小弟,另外即使没有了社团,
小弟们依旧可以到别的地方搞事情。
组合(Composition):与聚合类似,程度更加强烈,共生死,组合类
负责被组合类的生命周期,比如: 社团 和 大佬,如果没了社团,
大佬也就就不能存在了。
3.面向对象七大原则
· 单一职责原则(Single Responsibility Principle)
每一个类应该专注于做一件事情。 即:高内聚,低耦合。
· 开闭原则(Open Close Principle)
一个对象对扩展开放,对修改关闭。即:对类的改动
是通过增加代码进行的,而不是修改现有代码。
· 里氏替换原则(Liskov Substitution Principle)
在任何父类出现的地方都可以用它的子类来替代。
· 依赖倒置原则(Dependence Inversion Principle)
要依赖于抽象,不要依赖于具体实现。
· 接口隔离原则(Interface Segregation Principle)
应当为客户端提供尽可能小的单独的接口,而不是提供大的总的接口。
· 迪米特原则(Law Of Demeter)
一个对象应当尽量少地与其他对象之间发生相互作用,使得系统功能模块相对独立。
· 组合/聚合复用原则(Composite/Aggregate Reuse Principle)
尽量使用组合/聚合的方式,而不是使用继承。
运行时多态(动态绑定,new后面什么类型,动态类型就是什么类型)
示例如下: