一、面向对象编程
1、面向对象的三大特征五大原则
1.1、面向对象的三大特征
- 封装:将一些属性和行为(方法)抽象到一个类中,每个类作为一个节点,每个节点之间通过接口来进行通信,一个节点并不需要知道另一个节点中接口的实现细节。业务系统中所有的交互都由一个一个的对象节点的通信来完成。
- 继承:子类可以继承父类中一部分的属性和行为(方法),当然子类也可以实现自己的行为(方法),从而实现代码的复用和拓展。
- 多态:父类引用可以指向子类对象,接口类引用可以指向其实现类对象。这些父类引用或者接口类引用调用方法,实际在运行时,虚拟机会找到这些引用指向的子类或者实现类对象,执行这些子类或者实现类中的方法。父类或接口类引用调用方法的行为根据实际指向的对象不同而不同,使得父类或接口类引用执行同一个行为具有多个不同表现形式或形态。多态可以消除类之间和耦合,让代码便于维护和拓展。
1.2、面向对象的五大原则
- 单一职责原则:单一职责是所有设计原则的基础。A class should have only one reason to change. 也就是说,如果有多种变化原因导致一个类要修改,那么这个类就违反了单一职责原则。
- 开发封闭原则:开闭原则是设计的终极目标。一个类对拓展开放,对修改关闭。比如JDK的类库如果一个类被修改,可能导致所有依赖这个类的地方都要进行修改,甚至导致依赖链条式的修改。你可以通过扩展,而不是修改来改变软件的行为,将对依赖方的影响降到最低。这也是代码设计时强调高内聚,低耦合的原因。
- 里氏替换原则:里氏替换原则强调的是子类替换父类后程序运行时的正确性,它用来帮助实现开闭原则。里氏替换原则说的是派生类(子类)对象能够替换其基类(父类)对象被使用,保证了系统扩展和演进的稳定性。
- 接口隔离原则:而接口隔离原则用来帮助实现里氏替换原则,同时它也体现了单一职责。接口隔离原则说的是客户端不应该被迫依赖于它不使用的方法。设计更小和更具体的瘦接口,避免庞大臃肿的胖接口。接口过于臃肿,往往会导致实现类需要实现一些他并不需要不使用的方法,强调高内聚。
- 依赖倒置原则:依赖倒置原则是过程式编程与OO编程的分水岭,同时它也被用来指导接口隔离原则。面向过程的开发,上层调用下层,上层依赖于下层,当下层剧烈变动时上层也要跟着变动,这就会导致模块的复用性降低而且大大提高了开发的成本。面向对象的开发很好的解决了这个问题,一般情况下抽象的变化概率很小,让上层调用依赖于抽象,下层实现的细节也依赖于抽象。实现了上层调用和底层实现的解耦,也通过不同的抽象实现类对下层业务细节进行拆解。这样不仅增加了代码可读性,这样代码也不会越来越臃肿,易于后期维护。
参考:面向对象的三大基本特征,五大基本原则 写了这么多年代码,你真的了解SOLID吗?
2、类之间的关系
总的来说,类与类之间的关系有:继承关系(is-a/extends) 、实现关系(implements)、依赖关系(uses-a)、关联关系(frequently-uses-a)、 聚合关系(has-a/整体与局部且局部可拆解)、组合关系(contains-a/整体与局部且局部不可分割)。
其中关联关系是一种强依赖关系,而聚合关系和组合关系是关联关系中的两个特例,聚合关系就像房间和沙发的关系,组合关系就像人和人的大脑的关系。
参考:类与类之间的几种关系
二、JAVA访问权限控制:public、private、protect、无访问修饰符
public 修饰的类、接口、变量和方法对这个类以及所有其他的类都可见
protect 修饰的变量和方法对这个类以及和这个类同一个包中的类可见,并且其他包中的子类可以继承父类中用protect修饰的变量和方法,但是其他包中的子类不可以通过父类的实例对象直接访问父类用protect修饰的变量和方法
private 修饰的内部类、变量、方法仅对这个类可见,其他类不可以直接访问
default (无访问修饰符)修饰的类、接口、变量、方法对这个类以及和这个类同一个包中的类可见,其他包中的类不可以直接访问
(注:以上黄色标记部分是这些修饰符可以修饰的全部元素)
参考:Java访问权限控制