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 设计原则的具体体现。

【Java 温故而知新系列】基础知识-05 面向对象的更多相关文章

  1. Java多线程系列--“基础篇”05之 线程等待与唤醒

    概要 本章,会对线程等待/唤醒方法进行介绍.涉及到的内容包括:1. wait(), notify(), notifyAll()等方法介绍2. wait()和notify()3. wait(long t ...

  2. Java多线程系列 基础篇05 synchronized关键字

    1. synchronized原理 在java中,每一个对象有且仅有一个同步锁,所以同步锁是依赖于对象而存在.当我们调用某对象的synchronized方法时,就获取了该对象的同步锁.例如,synch ...

  3. Java多线程系列--“基础篇”11之 生产消费者问题

    概要 本章,会对“生产/消费者问题”进行讨论.涉及到的内容包括:1. 生产/消费者模型2. 生产/消费者实现 转载请注明出处:http://www.cnblogs.com/skywang12345/p ...

  4. Java多线程系列--“基础篇”06之 线程让步

    概要 本章,会对Thread中的线程让步方法yield()进行介绍.涉及到的内容包括:1. yield()介绍2. yield()示例3. yield() 与 wait()的比较 转载请注明出处:ht ...

  5. Java多线程系列--“基础篇”07之 线程休眠

    概要 本章,会对Thread中sleep()方法进行介绍.涉及到的内容包括:1. sleep()介绍2. sleep()示例3. sleep() 与 wait()的比较 转载请注明出处:http:// ...

  6. Java多线程系列--“基础篇”08之 join()

    概要 本章,会对Thread中join()方法进行介绍.涉及到的内容包括:1. join()介绍2. join()源码分析(基于JDK1.7.0_40)3. join()示例 转载请注明出处:http ...

  7. Java多线程系列--“基础篇”09之 interrupt()和线程终止方式

    概要 本章,会对线程的interrupt()中断和终止方式进行介绍.涉及到的内容包括:1. interrupt()说明2. 终止线程的方式2.1 终止处于“阻塞状态”的线程2.2 终止处于“运行状态” ...

  8. Java多线程系列--“基础篇”10之 线程优先级和守护线程

    概要 本章,会对守护线程和线程优先级进行介绍.涉及到的内容包括:1. 线程优先级的介绍2. 线程优先级的示例3. 守护线程的示例 转载请注明出处:http://www.cnblogs.com/skyw ...

  9. Java面试题-基础知识

    参考文章:Java面试题-基础知识 基础能力 什么是值传递和引用传递 线程状态有哪些,它们之间是如何转换的 进程与线程的区别,进程间如何通讯,线程间如何通讯? HashMap的数据结构是什么?如何实现 ...

  10. iOS系列 基础篇 05 视图鼻祖 - UIView

    iOS系列 基础篇 05 视图鼻祖 - UIView 目录: UIView“家族” 应用界面的构建层次 视图分类 最后 在Cocoa和Cocoa Touch框架中,“根”类时NSObject类.同样, ...

随机推荐

  1. .NET 9 发布 性能提升、AI 支持与全方位改进

    前言 .NET 9 正式发布,这是迄今为止最高效.现代.安全.智能且高性能的 .NET 版本. 新版本凝聚了全球数千名开发者的共同努力,包含了数千项性能.安全性和功能性改进. 主要亮点 性能提升:全面 ...

  2. Redis性能优化的18招

    前言 Redis在我们的日常开发工作中,使用频率非常高,已经变成了必不可少的技术之一. Redis的使用场景也很多. 比如:保存用户登录态,做限流,做分布式锁,做缓存提升数据访问速度等等. 那么问题来 ...

  3. 分析什么情况下回有大量的垃圾回收(GC)

    在前端性能监控中,大量的垃圾回收(GC)通常是由以下原因导致的: 内存泄漏:当页面中的对象没有被正确地释放或引用计数错误时,会导致内存泄漏.当内存中的对象达到一定数量时,JavaScript 引擎会执 ...

  4. Educational Codeforces Round 155 (Rated for Div

    B. Chips on the Board 题解:贪心 显然我们可以把题意转化为:对于任意一个\((i,j)\),我们可以花费\(a_{i,j}\)的代价占据第\(i\)行和第\(j\)列,求占据所有 ...

  5. 一个关于CountDownLatch的并发需求

    需求 A,B,C可并发运行,全部成功才算成功,一个失败全员回滚. 思考 使用CountDownLatch,可以保证三个线程结束后,才进行提交成功状态.但是怎么才能判断某个任务失败了呢? 捕获子线程异常 ...

  6. Vue 模版解析

    1.大括号表达式 (1)在MVVM()中接收并保存配置对象 (2)调用Compile编译函数,将el和vm传入 function MVVM (option) { this.$option = opti ...

  7. WinForm 开源组件 Realtiizor

    Realtiizor 的优势 现代美观的界面设计 Realtiizor 为 WinForm 应用带来了现代感十足的界面风格.它采用了流行的设计理念,如 Material Design 的元素融入,使得 ...

  8. windows版 nvm 1.1.7 安装(填坑)

    参考https://www.jianshu.com/p/cbf4f76ba0bb安装,注意事项: 1. 最好下载Setup安装版本,带安装界面,这样可以填写安装路径以及Nodejs路径,省去了改文件的 ...

  9. GienTech动态|入选软件和信息技术服务竞争力百强;参展世界计算大会、网络安全博览会

    ​ ​ ---- GienTech动态 ---- 中电金信参展广东省网络安全博览会.世界计算机大会 ​ ​ 近期,中电金信跟随中国电子参展2023年广东省网络安全博览会(下简称"博览会&qu ...

  10. Linux&shell通过正则表达式查找文件练习

    linux&shell编程中通过正则表达式来匹配查找文件极大的提高查找效率. 首先,解释一下下边出现的命令. linux部分: ls:查看文件夹内的命令. |:管道. grep:搜索后边匹配的 ...