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. 关于C++当中的指针悬空问题

    一.哪里遇到了这个问题 在进行MNN机器学习框架的MFC应用开发的时候遇到了这个问题,在窗口控件代码段 "MNN_Inference_BarCode_MFCDlg.cpp" 当中需 ...

  2. delphi BDE Reader 不需要驱动

    用过Delphi开发的几乎都知道BDE,是读取paradox DB (*.db)数据库(表)读取的驱动. 要存取数据,必需安装 BDE驱动程序,才能正常读取,还需要配置,发布程序就更不方便,所以吐槽的 ...

  3. delphi Image32 SVG图形查看器

    DELPHI 中没有SVG显示组件,需要用到第三方组件,高版本可以使用skia(但必须带上skia.dll). 最新版Image32修改了很多,SVGIconImageList 也因此换成了Image ...

  4. CSP2023 游寄

    CSP2023 游寄 没错,又寄. day -n 停课集训,天天打联测模拟赛,人麻了. day -n 请假回家了,人更麻了. 和姐姐拥抱了. 差点睡过头,天天下大雨,悲. 我妈和亲戚出去了,和哥在家通 ...

  5. CAD快速图层孤立、隐藏、锁定下载

    AutoCAD快速图层孤立.隐藏.锁定插件下载 链接 AutoCAD Quick Layer Isolation, Hide, Lock Plugin Download Link MAG.fas&am ...

  6. Git学习【1】 -- 基本常用命令

    目录 1.设置用户名 2.设置用户邮箱 3.初始化文件夹 4.如何修改文件 5.如何删除文件 6. 远程github操作 7. 设置密码 安装完Git,如何玩呢?下面是一些初始化和初级的常用命令. 新 ...

  7. 0. RyuJIT Tutorials - RyuJIT 的历史和架构

    目录 上一篇:无 下一篇:待更新 正文 RyuJIT - 即 .NET 的 JIT 编译器,负责将 IL 代码编译为最终用于执行的机器代码. 本系列为 RyuJIT 教程,将分为多篇进行更新发布,旨在 ...

  8. vue组件传参props

    传参格式,将需要传的参数以属性方式写在组件标签上 //组件标签 <zu a='参数一' b='参数b'></zu> 接收格式,在组件内 //props属性接收参数 props: ...

  9. Grid 网格布局备忘录

    概述 网格布局(Grid)是最强大的 CSS 布局方案. 它将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局. Grid 布局与 Flex 布局有一定的相似性,都可以指定容器内部多个 ...

  10. Centos中keytool不起作用的解决方法

    ​keytool是Java开发中用于管理密钥和证书的工具,可以用于生成密钥.创建证书请求.导入和导出证书等操作.你可以在Oracle官网上下载和安装JDK,然后在JDK的 bin目录下找到 keyto ...