【Java 温故而知新系列】基础知识-05 面向对象
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 面向对象的更多相关文章
- Java多线程系列--“基础篇”05之 线程等待与唤醒
概要 本章,会对线程等待/唤醒方法进行介绍.涉及到的内容包括:1. wait(), notify(), notifyAll()等方法介绍2. wait()和notify()3. wait(long t ...
- Java多线程系列 基础篇05 synchronized关键字
1. synchronized原理 在java中,每一个对象有且仅有一个同步锁,所以同步锁是依赖于对象而存在.当我们调用某对象的synchronized方法时,就获取了该对象的同步锁.例如,synch ...
- Java多线程系列--“基础篇”11之 生产消费者问题
概要 本章,会对“生产/消费者问题”进行讨论.涉及到的内容包括:1. 生产/消费者模型2. 生产/消费者实现 转载请注明出处:http://www.cnblogs.com/skywang12345/p ...
- Java多线程系列--“基础篇”06之 线程让步
概要 本章,会对Thread中的线程让步方法yield()进行介绍.涉及到的内容包括:1. yield()介绍2. yield()示例3. yield() 与 wait()的比较 转载请注明出处:ht ...
- Java多线程系列--“基础篇”07之 线程休眠
概要 本章,会对Thread中sleep()方法进行介绍.涉及到的内容包括:1. sleep()介绍2. sleep()示例3. sleep() 与 wait()的比较 转载请注明出处:http:// ...
- Java多线程系列--“基础篇”08之 join()
概要 本章,会对Thread中join()方法进行介绍.涉及到的内容包括:1. join()介绍2. join()源码分析(基于JDK1.7.0_40)3. join()示例 转载请注明出处:http ...
- Java多线程系列--“基础篇”09之 interrupt()和线程终止方式
概要 本章,会对线程的interrupt()中断和终止方式进行介绍.涉及到的内容包括:1. interrupt()说明2. 终止线程的方式2.1 终止处于“阻塞状态”的线程2.2 终止处于“运行状态” ...
- Java多线程系列--“基础篇”10之 线程优先级和守护线程
概要 本章,会对守护线程和线程优先级进行介绍.涉及到的内容包括:1. 线程优先级的介绍2. 线程优先级的示例3. 守护线程的示例 转载请注明出处:http://www.cnblogs.com/skyw ...
- Java面试题-基础知识
参考文章:Java面试题-基础知识 基础能力 什么是值传递和引用传递 线程状态有哪些,它们之间是如何转换的 进程与线程的区别,进程间如何通讯,线程间如何通讯? HashMap的数据结构是什么?如何实现 ...
- iOS系列 基础篇 05 视图鼻祖 - UIView
iOS系列 基础篇 05 视图鼻祖 - UIView 目录: UIView“家族” 应用界面的构建层次 视图分类 最后 在Cocoa和Cocoa Touch框架中,“根”类时NSObject类.同样, ...
随机推荐
- 记录java接口自动化模板优化
项目路径说明 内容优化 优化内容 1.自动生成的测试报告集成至项目中,可直接通过项目访问测试报告(之前生成测试报告位于项目外,需要手动打开) 优化效果: 2.后续会增加allure测试报告集成使用(实 ...
- 基于 Github 平台的 .NET 开源项目模板 - ISSUE 相关
上一篇已经介绍了工程和脚本.下面我们将以具体的功能作为着手点, 展开对 project.yml 工程配置文件的讲解. 赘述 project.yml 使用周期 文件来源: 运行跟目录下的 scanner ...
- 告别繁琐的云平台开发!IoT_CLOUD之【百度云】
众所周知,市面上有很多云平台,阿里云.腾讯云.中移OneNET.华为云.百度云.涂鸦云.Tlink云等等......并且每家云平台都有自己的协议,工程师要移植不同的SDK代码或基于各家的手册文档对 ...
- 解决MindSpore-2.4-GPU版本的安装问题
问题背景 虽说在MindSpore-2.3之后的版本中不在正式的发行版中支持GPU硬件后端,但其实在开发分支版本中对GPU后端是有支持的: 但是在安装的过程中可能会遇到一些问题或者报错,这里复现一下我 ...
- C#-公众号H5页面授权获取用户code、openid、unionid
一:配置信息 公众号设置: 1:设置 IP白名单(所在的服务器ip).记录公众号APPID和APPsecret; 2:设置 网页授权域名; 二:页面授权----[html中获取code] 1:页面引入 ...
- 高性能消息队列之nsq
NSQ 是实时的分布式消息处理平台,其设计的目的是用来大规模地处理每天数以十亿计级别的消息. NSQ 具有分布式和去中心化拓扑结构,该结构具有无单点故障.故障容错.高可用性以及能够保证消息的可靠传递的 ...
- Select、Poll、Epoll 有什么区别?
部分图片来源于:https://www.cnblogs.com/yanguhung/p/10145755.html I/O模型 BIO:同步阻塞IO 应用程序发起调用以后,一直阻塞,等待结果返回 2. ...
- OpenTelemetry 101:面向 IT 领导者和爱好者的非技术指南
如果您从事软件开发. SRE或DevOps工作,您可能听说过可观察性.遥测和跟踪等术语.这些概念对于理解应用程序在生产环境中的行为至关重要,并且它们是现代软件开发实践的重要组成部分. 您可能还听说过在 ...
- Business Object 开发
一 什么是BO BO(Business Object),封装在数据库之上,用于直接操作数据(增.删.改.查) 针对不同的BO,在安装目录下有对应的DLL文件,其中封装了BO各式针对具体的业务的方法, ...
- .NET 中的中间件(Middleware)
ASP.NET Core 中间件 什么是中间件(Middleware)? 中间件是组装到应用程序管道中以处理请求和响应的软件. 每个组件: 选择是否将请求传递给管道中的下一个组件. 可以在调用管道中的 ...