【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类.同样, ...
随机推荐
- .NetCore+Mysql+Vue+MVC+SqlSugar开源WMS仓库管理系统
今天给大家推荐一个开源免费WMS仓库管理系统.仓库管理系统,可以有效控制并跟踪仓库业务的物流和成本管理全过程,实现或完善企业的仓储信息管理. 项目功能列表 基础数据 系统设置 物料管理 客户管理 供应 ...
- 云开发实践:从 0 到 1 带你玩 AI
今天我们将深入分析云开发的 AI 能力.这次的讨论焦点不再是之前提到的云端IDE编写代码的能力,而是更为广泛和实际的内容--如何利用云平台提供的各种模块化能力,快速高效地开发.今天的主题依然围绕AI展 ...
- ubuntu界面文件夹出现了很多隐藏文件夹如何不显示
突然发现文件夹下很多隐藏文件夹都显示出来了,也不知道怎么弄得,想隐藏他们,百度提问无果,提到隐藏这种关键字全是ls这种让我终端查看文件列表. 自己仔细看了看文件夹资源管理器,发现有个按钮 就是这个选项 ...
- python的egg的制作
egg包是目前最流行的python应用打包部署方式.如何制作和安装egg包?下面我就简单的分析了一下. 总是安装别人的egg包,是不是也想制作自己的egg包呢?好,接下来我们就自己制作一个简单的egg ...
- curl访问etcd报错unable to set private key file
[appdeploy@1a32vla0168zzzz cfssl]$ curl -i https://xxx.xxx.xxx.5:2379/health --cacert /app/etcd/cfss ...
- MyBatis入门示例——MyBatis学习笔记之一
MyBatis是另外一款优秀的ORM框架,前身为iBATIS.凡事预则立,不预则废.鉴于以后的项目可能会用到它,因此决定提前学习.本着分享和督促自己学习的目的,笔者将陆续把学习笔记贴出,希望对朋友们有 ...
- Java线程池Executors
一 简述 线程池,作为一个管理一组同构工作线程的资源.接受提交的任务,利用线程池中的线程进行工作的处理. 在另一篇<Java多线程设计模式(4)线程池模式>利用非Executors描述了线 ...
- mongo迁移工具之mongo-shake
最近需要进行MongoDB中数据迁移,之前使用过阿里系的redisShake感觉不错, 这次打算使用mongoShake来进行同步 github: https://github.com/alibaba ...
- vue3 + pnpm 打造一个 monorepo 项目
Monorepo 和 Multirepo 单一仓库(Monorepo)架构,可以理解为:利用单一仓库来管理多个packages的一种策略或手段:与其相对的是多仓库(Multirepo)架构 Monor ...
- 终于解决了.net在线客服系统总是被360误报的问题(对软件进行数字签名)
升讯威在线客服与营销系统是基于 .net core / WPF 开发的一款在线客服软件,宗旨是: 开放.开源.共享.努力打造 .net 社区的一款优秀开源产品. 背景 我在业余时间开发的这个客服系统, ...