1、面向对象概述
面向对象(Object-Oriented,简称OO)是一种编程思想,核心思想是将现实世界中的事物抽象为程序中的"对象",通过对象之间的交互来解决问题。
对象
-
对象是面向对象编程的基本单元,包含数据(属性)和行为(方法)。
-
例如,一个"汽车"对象可以有属性(颜色、品牌)和方法(启动、停止)。
类
-
类是对象的模板或蓝图,定义了对象的属性和方法。
-
例如,"汽车"类可以定义所有汽车共有的属性和行为,而具体的汽车则是该类的实例。
2、面向对象的特性
面向对象有四大特性:封装,继承,多态,抽象;也有3大特性的说法通常是指:封装、继承和多态。
1、封装就是将类的信息隐藏在类内部,不允许外部程序直接访问,而是通过该类的方法实现对隐藏信息的操作和访问。 良好的封装能够减少耦合。
2、继承是从已有的类中派生出新的类,新的类继承父类的属性和行为,并能扩展新的能力,大大增加程序的重用性和易维护性。在Java中是单继承的,也就是说一个子类只有一个父类。
- 子类拥有父类非 private 的属性和方法。
- 子类可以拥有自己属性和方法,即子类可以对父类进行扩展。
- 子类可以用自己的方式实现父类的方法。
3、多态是同一个行为具有多个不同表现形式的能力。在不修改程序代码的情况下改变程序运行时绑定的代码。实现多态的三要素:继承、重写、向上转型(父类引用指向子类对象)。只有满足了上述三个条件,我们才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象,从而达到执行不同的行为。父类或接口定义的引用变量可以指向子类或具体实现类的实例对象。提高了程序的拓展性。对于Java而言,它多态的实现机制遵循一个原则:当超类对象引用变量引用子类 对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。
- 静态多态性:通过方法重载(overload)实现,是编译时的多态性(也称为前绑定),相同的方法有不同的參数列表,可以根据参数的不同,做出不同的处理。
- 动态多态性:也叫运行时的多态性(也称为后绑定)。一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是 哪个类中实现的方法,必须在由程序运行期间才能决定在多个子类中重写父类的方法继承 和接口 (实现接口并覆盖接口中同一方法)都能实现多态。运行期间判断所引用对象的实际类型,根据其实际类型调用相应的方法。
4、抽象。把客观事物用代码抽象出来。
3、面向对象基本原则
- 单一职责原则SRP(Single Responsibility Principle)
类的功能要单一、职责明确,不能包罗万象,是个万能对象(比如商品类,里面相关的属性和方法都必须跟商品相关,不能出现订单等不相关的内容。这里的类可以是模块、类库、程序集,而不单单指类)。
- 开放封闭原则OCP(Open-Close Principle)
一个模块对于拓展是开放的,对于修改是封闭的。
- 迪米特法则(Law of Demeter,LoD)
高内聚,低耦合。尽量不要依赖细节。 一个对象应尽可能少地了解其他对象,只与直接朋友(即成员变量、方法参数、返回值等)交互。
- 里式替换原则LSP(the Liskov Substitution Principle LSP)
子类能够完全替代父类,反之则不行。通常用于实现接口时运用。这也是多态的基本要素。因为子类能够完全替代基(父)类,那么这样父类就拥有很多子类,在后续的程序扩展中就很容易进行扩展,程序完全不需要进行修改即可进行扩展
- 依赖倒置原则DIP(the Dependency Inversion Principle DIP)
高层模块不应该依赖于低层模块;二者都应该依赖于抽象;抽象不应该依赖于细节;细节应该依赖于抽象
面向抽象编程。也就是参数传递,或者返回值,可以使用父类类型或者接口类型。从广义上讲:基于接口编程,提前设计好接口框架。
- 接口分离原则ISP(the Interface Segregation Principle ISP)
设计时采用多个与特定客户类有关的接口比采用一个通用的接口要好。就比如一个手机拥有打电话,看视频,玩游戏等功能,把这几个功能拆分成不同的接口,比在一个接口里要好的多。
4、Spring Boot框架中对面向对象(OOP)的思想体现在
封装(Encapsulation):
Spring Boot 通过使用 @Component, @Service, @Repository 和 @Controller 等注解来定义类的角色,并将功能相关的代码封装在一起。
使用 private 关键字限制对类属性的直接访问,提供 getter 和 setter 方法来控制对这些属性的访问。
继承(Inheritance):
继承可以在 Spring Boot 中用来创建具有共同行为或属性的组件。
可以通过扩展 Spring 框架提供的抽象类或实现接口来定制应用程序的行为。
多态(Polymorphism):
多态性允许你使用父类类型的引用指向子类的对象,这在 Spring Boot 中可以通过依赖注入来实现,例如,你可以注入一个接口的实现,并在运行时改变具体实现。
Spring Boot 支持方法重写,这可以让你根据需要自定义或修改已有方法的行为。
抽象(Abstraction):
抽象化是隐藏复杂的实现细节并仅向用户暴露必要的部分。
在 Spring Boot 中,许多复杂配置被简化为简单的注解或自动配置,如 @SpringBootApplication 注解,它隐藏了很多底层的初始化工作。
依赖注入(Dependency Injection, DI):
虽然依赖注入不是 OOP 的核心原则,但它与 OOP 密切相关,并且是 Spring 框架的一个重要特性。
通过依赖注入,对象不再负责创建它们所依赖的对象,而是由 Spring 容器负责管理和提供这些依赖。这有助于提高代码的可测试性和松耦合。
面向接口编程(Programming to an Interface):
推荐的做法是依赖于接口而不是具体的实现类,这样可以使代码更加灵活,易于扩展和维护。
Spring Boot 鼓励开发者使用接口定义服务层、数据访问层等,然后在运行时选择适当的实现。
组合(Composition):
组合是将对象组合成更复杂的结构,而不需要使用继承。Spring Boot 应用程序中经常使用组合来构建功能模块,比如通过组合不同的服务来完成业务逻辑。
设计模式的应用:
Spring Boot 广泛应用了各种设计模式,如工厂模式、单例模式、模板方法模式等,这些都是 OOP 设计原则的具体体现。
5、Java中抽象类和接口的对比
抽象类是用来捕捉子类的通用特性的。接口是抽象方法的集合。
从设计层面来说,抽象类是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。
** 相同点:**
- 接口和抽象类都不能实例化
- 都位于继承的顶端,用于被其他实现或继承
- 都包含抽象方法,其子类都必须覆写这些抽象方法
不同点:
|-----------|--------------------------------------------------------|-------------------------------------------------|
| 比较点 | 抽象类 | 接口 |
| 声明 | 抽象类使用abstract关键字声明 | 接口使用interface关键字声明 |
| 实现 | 子类使用extends关键字来继承抽象类。如果子类 不是抽象类的话,它需要提供抽象类中所有声明 的方法的实现 | 子类使用implements关键字来实现 接口。它需要提供接口中所有声明的 方法的实现 |
| 构造器 | 抽象类可以有构造器 | 接口不能有构造器 |
| 访 问 修 饰 符 | 抽象类中的方法可以是任意访问修饰符 | 接口方法默认修饰符是public。并且 不允许定义为 private 或者 protected |
| 多 继 承 | 一个类最多只能继承一个抽象类 | 一个类可以实现多个接口 |
| 字 段 声 明 | 抽象类的字段声明可以是任意的 | 接口的字段默认都是 static 和 final的 |
备注: Java8中接口中引入默认方法和静态方法,以此来减少抽象类和接口之间的差异。现在,我们可以为接口提供默认实现的方法了,并且不用强制子类来实现它。接口和抽象类各有优缺 点,在接口和抽象类的选择上,必须遵守这样一个原则:
-
- 行为模型应该总是通过接口而不是抽象类定义,所以通常是优先选用接口,尽量少用抽象类。
- 选择抽象类的时候通常是如下情况:需要定义子类的行为,又要为子类提供通用的功能。