面向对象(一)
这是我参与新手入门的第3篇文章
面向对象是java基础里面的重点,这里我将多分几篇去总结。
面向对象概述
面向对象编程(OOP)Object Oriented Programming,面向对象是一种思想,经常听到的一句话就是:万事万物皆对象。
该如何去理解呢?其实这就是一个归纳、整理和抽象的过程。比如生活中的桌椅板凳、汽车飞机、包子面条等等,我们对某一类事务的归类和定义称为类,而类中具体的一个事务,如一张具体电脑桌、一辆五菱宏光、一个叉烧包和一碗牛肉面这些都是具体的对象。类定义了某一类对象的属性和功能,类是抽象,对象是具体。举个栗子:桌子是类,这个类中包含长、宽、高、颜色、材质、形状等等属性,还有放物体功能。电脑桌是一个具体的对象,这些属性都有具体的数值,实现了放电脑这个功能。
在编程时我们先将需要实现的功能抽象成一个个类,里面定义我们需要的数据和方法,然后通过创建对象去实现具体的方法。
三大特性
-
封装:将客观事物抽象为逻辑实体,实体的属性和功能相结合,形成一个有机的整体。并对实体的属性和功能实现进行访问控制,向信任的实体开放,对不信任的实体隐藏。通过开放的外部接口即可访问,无需知道功能如何实现。
封装主要有以下目的:
- 可隐藏实体实现的细节。
- 提高安全性,设定访问控制,只允许具有特定权限的使用者调用。
- 简化编程,调用方无需知道功能是怎么实现的,即可调用。
-
继承:在继承机制下形成有层级的类,使得低层级的类可以延用高层级类的特征和方法。继承的实现方式有两种:实现继承、接口继承。
实现继承:直接使用基类公开的属性和方法,无需额外编码。
接口继承:仅使用接口公开的属性和方法名称,需要子类实现。
继承有以下目的:
- 复用代码,减少类的冗余代码,减少开发工作量。
- 使得类与类之间产生关系,为多态的实现打下基础。
继承的时候涉及到两个概念 方法重载 方法重写
- 方法重载:在同一个类中处理不同数据的多个相同方法名的多态手段。(函数名一样,类型参数不一样)
- 方法重写:相对继承而言,子类中对父类已经存在的方法进行区别化的修改。
-
多态:是指一个类的同名方法,在不同情况下的实现细节不同。多态机制实现不同的内部实现结构共用同一个外部接口。
多态有以下目的:
- 一个外部接口可被多个同类使用。
- 不同对象调用同个方法,可有不同实现。
五大基本原则
-
单一职责 Single Responsibility Principle
- 定义:一个对象应该只包含单一的职责。并将该职责完整的封装到一个类中。
- 另一种定义:就一个类而言,应该仅有一个引起它变化的原因。
- 关键:单一职责,高内聚,低耦合
- 目的:高内聚,低耦合
- 其核心思想为:一个类,最好只做一件事,只有一个引起它的变化。
-
开闭原则 Open Close Principle
- 定义:一个软件实体应当对扩展开放,对修改关闭
- 关键:通过抽象封装可变元素
- 目的:在不修改源代码的情况下改变模块的行为
- 其核心思想是:软件实体应该是可扩展的,而不可修改的。
- 实现开开放封闭原则的核心思想就是对抽象编程,而不对具体编程,因为抽象相对稳定。
-
里氏替换原则 Liskov Substitution Principle
- 定义:所有引用基类的地方都能透明的使用其子类。是实现开闭原则的重要方式之一
- 目的:在程序中尽量使用积累类型来对对象进行定义,而在运行时在确定其子类类型
- 其核心思想是:子类必须能够替换其基类。
- 实现的方法是面向接口编程:将公共部分抽象为基类接口或抽象类,通过Extract Abstract Class,在子类中通过覆写父类的方法实现新的方式支持同样的职责。
-
依赖倒转原则 Dependence Inversion Principle
- 定义:高层模块不应该依赖底层模块,都应该依赖抽象,细节依赖于抽象,抽象不依赖于细节
- 常用实现方式:在代码中使用抽象类,而将具体类放在配置文件中
- 其核心思想是:依赖于抽象。具体而言就是高层模块不依赖于底层模块,二者都同依赖于抽象;抽象不依赖于具体,具体依赖于抽象。
-
接口隔离原则 Interface segregation Principle
-
定义:客户端不应该依赖那些它不需要的接口interface(这里的接口指的是所定义的方法)。
-
另一种定义:一旦一个接口太大,则需要将它分割成一些更细小的接口,使用该接口的客户端仅需要知道与之相关的方法即可。
-
其核心思想是:使用多个小的专门的接口,而不要使用一个大的总接口。
-
分离的手段主要有以下两种:1、委托分离,通过增加一个新的类型来委托客户的请求,隔离客户和接口的直接依赖,但是会增加系统的开销。2、多重继承分离,通过接口多继承来实现客户的需求,这种方式是较好的。
-