什么是面向对象编程(OOP)?

2023-10-26

Java 程序员第一个要了解的基础概念就是:什么是面向对象编程(OOP)

玩过 DOTA2 (一款推塔杀人的游戏)吗?里面有个齐天大圣的角色,欧洲战队玩的很溜,国内战队却不怎么会玩,自家人不会玩自家的神话英雄,实在有点悲哀。

我们用 Java 定义一个孙悟空的类吧:

public class SunWukong {
	private Integer healthPoint;// 生命值
	private Integer magicPoint;// 魔法值
	
	/**
	 * 棒击大地
	 */
	private void rodHittingTheEarth() {
		
	}
	
	/**
	 * 丛林之舞
	 */
	private void jungleDance() {
		
	}

}

我们给他两个属性(生命值 healthPoint 和魔法值 magicPoint),给他两个技能(棒击大地 rodHittingTheEarth() 和丛林之舞 jungleDance())。

假如我是 LGD(老干爹,国内知名 DOTA 战队)的教练 357(已辞职),一名聪明绝顶的好教练(真的秃头了),主要负责赛前的 BP(Ban 和 Pick,拌掉对方的英雄和选己方英雄) 工作。

现在,是 TI9 的小组赛(已结束),LGD 对阵 OB(欧洲战队,两届冠军) 的第一局。

我——357 在 BP 阶段先 BAN 掉了比较克制孙悟空的兽王和发条技师,然后在选人阶段(PICK)挑选了水晶室女这个冰美人来和孙悟空这个一身毛的家伙搭配。

那么,在我选孙悟空的这个阶段,就等于说创建了一个孙悟空的对象,也就相当于 Java 中的 new SunWukong()。选好了孙悟空,让谁来玩呢?自然是队中号称世界第一中单的 maybe。

面向对象编程(OOP)其实并不难懂,不就是英文单词 Object-Oriented Programming 的首字母缩写嘛。OOP 给我们一种概念,就是“万物皆对象”——我们可以尽可能的发挥想象,把现实中的物(包括动物、人物、甚至无生命的事物)抽象为一种计算机语言(比如 Java)能懂的模型,那么接下来,计算机解决现实中的问题就变得简单了起来。

OOP 的强大之处就在于,它使我们不必依照计算机的限制来模拟现实中的物;我们可以基于现实中要解决的问题来构建对象,使这个对象具有现实中物所具有的特征(对应 Java 类中的属性)和行为(对应 Java 类中的方法)。物不同,对象所具有的属性和方法就会不同。

还拿 DOTA 中的英雄来说吧。

所有的英雄都可以抽象为一个类(对象是类的实例化),这个类包含了英雄对应的成长属性(生命值、魔法值、伤害值、护甲值等等),以及对应的技能行为。那么,怎么区分每个英雄的不同呢?比如说冰美人水晶室女是一个魔法辅助类的英雄,因此,她的初始化生命值自然比敏捷类的齐天大圣低一些,但魔法值高一些;另外,他们的技能也完全不同——孙悟空拿着一根金箍棒,所以他的技能就有棒击大地;水晶室女拿着一根法杖,所以她的技能就有冰霜新星、冰封禁制等。

面向对象编程给我们了一些重要的启示:

1)万物皆对象。

2)程序是对象相互协作的一个过程,他们通过发送消息来告知彼此要做的事情。

3)每个对象都有自己的类型,也就是“每个对象都是某个类(抽象数据类型)的一个实例”。尽管每个对象都是唯一的(在内存中拥有一个唯一的地址),但具有相同状态(属性、变量)和类似行为(方法)的对象可以归属为一个类。

4)每个对象都提供了某种服务。比如说孙悟空可以跳上树上(丛林之舞),然后再跳下来对区域内的敌人造成减速和伤害(乾坤跳跃)。

面向对象编程的代码易维护、易复用、易扩展,因为面向对象有三大特性:封装、继承、多态。

1)封装,每个类(对象的模板)可以自由地定义属性和方法,使其有别于其他的类。封装可以隐藏对象的内部细节,使其对外形成一道边界,只保留有限的属性和方法与其他对象进行交互。封装的原则是使对象以外的部分不能随意的访问和操作对象的内部属性,从而避免了外界对对象内部属性的破坏。

2)继承,子类可以轻松地复用父类的代码(非 private 修饰的属性和方法),只需要一个关键字——extends。如果父类的属性不满足子类的需求,可以追加;如果父类的方法不满足子类的需求,可以覆盖。

3)多态,父类中定义的方法被子类继承之后,可以表现出不同的行为。这使得同一个方法在父类及其各个子类中具有不同的语义。例如:“椭圆”和“多边形”都是“几何图形”,假如它们都有一个名叫“绘图”的方法的话,方法内容肯定是不同的。

多态性体现在两个方面:由方法重载实现的编译时多态和方法重写实现的运行时多态。

编译时多态:在编译阶段,具体调用哪个被重载的方法,编译器会根据参数的不同来确定调用相应的方法。

运行时多态:由于子类继承了父类所有的属性(私有的除外),所以子类对象可以作为父类对象使用。程序中凡是使用父类对象的地方,都可以用子类对象来代替。一个对象可以通过引用子类的实例来调用子类的方法。

封装、继承、多态这三个特性对于初学者来说,有点头大。不过不用担心,我会在后面的文章中继续深入地介绍。

上一篇:Java:程序不过是几行代码的集合

下一篇:如何理解 Java 中的继承?

微信搜索「沉默王二」公众号,关注后回复「免费视频」获取 500G Java 高质量教学视频。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是面向对象编程(OOP)? 的相关文章

  • 仅运行相应源代码已更改的单元测试?

    我正在 Jenkins CI 服务器中运行单元测试和 Selenium 测试 众所周知 在大型项目中测试需要很长时间才能运行 Java 是否有一个工具 框架只能触发其源代码已更改的测试 这是因为并非每次对 SCM 的提交都会影响源代码的所有
  • 如何从球衣服务端点发送实体列表?

    我正在从球衣服务器发送实体列表 在客户端 我试图获取这些实体列表 但它给了元帅例外 为什么它在元素名末尾添加 s 即 emps 而不是 emp XmlRootElement public class Emp Server side code
  • 图像在 3D 空间中绕 Y 轴旋转

    我有一个 BufferedImage 我想用 theta 角而不是仿射变换绕 Java 中的 Y 轴旋转图像 图片 旋转将如下图所示 矩形将是图像 我可以通过旋转图像的每个像素并绘制图像来做到这一点 因为我必须旋转很多图像 所以我认为这不是
  • bean 的 CDI @TransactionAttribute

    我正在尝试CDI在测试应用程序上 我有一个DAO它注入一个托管的容器JTA像这样的持久化上下文 public class TestDAO implements Serializable PersistenceContext private
  • 如何确定 JDialog 显示在哪个屏幕上

    我有一个非常大的应用程序 有多个对话框 我的任务是确保不完全可见的对话框 因为用户将其从可见屏幕区域拉出 移回屏幕中心 当我只处理一个屏幕时 这没问题 它工作得很好 但是 该应用程序的大多数用户的桌面上都有两个屏幕 当我尝试找出对话框显示在
  • Byte[] 和 java.lang.OutOfMemoryError 按位读/写文件

    我正在努力擦除 Android 中的一些可用空间 这是我的代码 private void creatingFileDelete int size int passMode File lastFile new File Environment
  • 使用 Copy.CopyIntoItems Web 服务将文件上传到 SharePoint 2010 时收到 400 错误请求

    SharePoint 新手 我尝试使用 Java 的 CopyIntoItems Web 服务方法将文档上传到 SharePoint 但不断收到 400 错误请求 我使用 Java 的 wsimport 从 wsdl 文件生成类文件 这是我
  • 如何注册 org.springframework.integration.monitor.IntegrationMBeanExporter

    根据http www ibm com support knowledgecenter en SS7K4U 8 5 5 com ibm websphere nd multiplatform doc ae cspr data access tr
  • 如何从 Java 生产代码中删除调试语句

    编译器是否可以从生产代码中删除用于调试目的 例如日志记录 的语句 调试语句需要以某种方式进行标记 可能使用注释 设置属性 debug true 并在每个调试语句中检查它很容易 但这会降低性能 如果编译器能够简单地使调试语句消失 那就太好了
  • 如何防止我的 servlet 被其他网站调用

    好的 我有一个像这样的简单的 servlet public class SimpleServlet extends HttpServlet public void doPost HttpServletRequest req HttpServ
  • 字符串 a == 字符串 b 的规则 [重复]

    这个问题在这里已经有答案了 我试图了解字符串池的工作原理以及一个字符串等于另一个字符串的规则是什么 例如这个片段 public static void main String hi String s1 lol String s2 lol S
  • 覆盖乔达一周的第一天?

    是否有可能覆盖乔达弱的第一天sunday 因为 Joda 使用Monday作为一周的第一天 如果有办法的话 谁能解释一下 我在 SOF 中提到了以下主题 乔达时间 一周的第一天 https stackoverflow com questio
  • org.apache.poi 中的异常

    我试图编写一个可以读取和写入的程序 xlsx文件中 下面提供的代码旨在能够编写其第一个 Excel 程序 package excel reader import java io FileOutputStream import java io
  • 将序列化数据发送到 servlet 时出现 java.io.EOFException

    我正在尝试从 Java 本地应用程序上传一个包含文件到服务器的对象 我的计划是 在 tomcat 上运行的 servlet 将使用以下方法获取对象ObjectInputStream in the doGet方法 但我得到一个EOFExcep
  • Java 日期和 MySQL 时间戳时区

    我正在编辑一段代码 其基本功能是 timestamp new Date 然后坚持下去timestamp中的变量TIMESTAMPMySQL 表列 然而 通过调试我看到Date显示在正确时区的对象 GMT 1 当持久化在数据库上时 它是GMT
  • Java泛型类型参数中的问号是什么意思? [复制]

    这个问题在这里已经有答案了 这是取自斯坦福解析器附带的一些示例的一小段代码 我已经用 Java 进行了大约 4 年的开发 但从未对这种风格的代码应该表示什么有非常深入的理解 List
  • java.lang.IllegalStateException:FragmentManager 已被销毁

    活动中onResume我称之为 volley request 的方法 它获取项目列表 然后将它们加载到此活动内的 ListFragment 中 当我第一次进入活动时 一切正常 但当我重新进入活动时 ListFragment 为空 并且控制台
  • 当框架被拖动时,如何设置 JWindow 的位置位于文本字段下方?

    我正在制作一个自动完成项目 就像谷歌一样 我的框架中有一个 jtextfield 每当我在该字段中输入内容时 该文本字段下方就会出现一个 JWindow 并且该窗口来自另一个类 现在的问题是 每当我拖动框架时 如何使窗口始终出现在文本字段下
  • 如何使用 iBatis (myBatis) 的注释进行 IN 查询?

    我们只想在 MyBatis 中使用注释 我们确实在努力避免使用 xml 我们尝试使用 IN 子句 Select SELECT FROM blog WHERE id IN ids List
  • TypeScript 中 C# 类虚拟成员的等效项

    因此 在 C 中 当我创建模型类和延迟加载内容时 我会执行以下操作 public int User ID get set public int Dept ID get set 然后在我的班级稍远一点的地方 我像这样弹出我的虚拟 public

随机推荐

  • Java垃圾回收器的选择与配置

    一 垃圾回收器介绍 垃圾回收器 优点 缺点 针对 特性 常见组合方式 Serial 简单高效 单线程导致停顿较长 新生代 单线程 使用标记 复制算法 适合客户端模式 Serial 新生代 Serial Old 老年代 ParNew 多线程
  • 测试游戏帧率电脑温度的软件,游戏中显示帧数和温度方法_游戏画面中实时显示FPS帧数温度技巧...

    相信很多游戏玩家平时都是在用电脑玩游戏 而且大家也喜欢看一看自己在在游戏画面中实时的FPS帧数和温度信息 但是很网友对这个游戏画面中如何实时显示FPS帧数 频率 硬件温度不太清楚 下面智能手机网分享一下具体的操作方法 以便大家在玩游戏的时候
  • 内网渗透-windows信息收集(实战命令与工具)

    文章目录 一 前言 二 Windows信息收集 一 CMD 本机信息收集 二 CMD 域信息收集 三 Powershell命令信息收集 3 1 知识补齐 Get CimInstance 与 Get WmiObject区别 四 导出域信息 低
  • Matlab常见报错:错误使用 conv2不支持 N 维数组;cell类型数组不支持运算符

    一 错误使用 conv2不支持 N 维数组 错误样例 原因 提示错误使用 conv2不支持 N 维数组 可能是因为你读取的图像并不是灰度图像 而是RGB图像 有red green blue三种颜色通道也就是说是三维的矩阵 所以我们需要将图像
  • Java day04 运算符 隐式转换 补码反码 --判断和循环 day05--循环高级和数组 random

    运算符 01 算术运算符的基本用法 运算符 02 除法和取模 运算符 03 算术运算符 数值拆分 1 导包 找到Scanner这个类在哪 书写注意 写在类定义上面 import java util Scanner public class
  • 再次用construct 2制作游戏

    有了上一次用construct 2制作游戏的经验 这次的制作过程明显比上次简单了许多 我决定尝试一下新的游戏类型 希望能有新的突破 这一次 我制作的是类似雷电的飞机射击游戏 第一步 先选好背景 第二步 添加各种objects 第三步 设置航
  • 编程每日一题_C程序设计_年份闰年/平年判断

    描述 输入年份 判断该年份是平年还是闰年 普通闰年 年份数值为4的倍数 且不是100的倍数 世纪闰年 公历年份是整百数 且是400的倍数 正确解法一 嵌套判断 满足条件即输出判断结果 include
  • SQL注入时order by 后面加数字的作用

    此文章是记录本人对知识理解的随手笔记 内容不肯定百分百正确 如有错误望指出并谅解 结论 order by 后面加数字可以判断服务器在查询某个表时所查询的列数 原理 1 当sql查询语句为 select username password u
  • Ruby 2.1 GC策略

    对象管理主要涉及 Profiling support 增加了hook用于状态获取 专用API 分代式GC引入
  • c++将模板实现放在cpp,外部使用模板的方法(demo,gcc+msvc(动态库))

    参考https blog csdn net mincheat article details 77987740 一般情况 模板函数被外部其他引用会提示找不到函数 原因是 编译本身这个cpp的时候 没有发现有引用的地方 那么就不会被编译 而编
  • 使用QEMU+GDB调试Linux驱动程序

    前提 QEMU中已经添加了设备支持 能够正常insmod rmmod xxx ko 然后才能有接下来的调试 step1 打开如下编译选项然后编译Linux内核 CONFIG DEBUG INFO y CONFIG RANDOMIZE MEM
  • 毕业设计 - STM32公交站牌系统

    文章目录 1 简介 2 主要器件 2 1 ILI9320 2 2 串口GPRS模块 2 3 相关传感器 3 实现效果 4 设计原理 5 部分实现代码 6 最后 1 简介 Hi 大家好 学长今天向大家介绍一个单片机项目 STM32公交站牌系统
  • 简易agv小车自动导航控制协议

    1 获取地图栅格 2 实体化 转换 3 行走指令 调度优先处理 1 比如 前面 10 100米 行走指令序列 2 以 后面 0 10分钟 行走指令序列 4 处理栅格 5 转换计算成行走操作 1 速度 2 绝对移动位置 3 错误操作 4 阻碍
  • ubuntu的APT介绍

    介绍 apt是一款安装包管理工具 在ubuntu下可以使用apt命令进行软件包的安装 删除 清理等 ubuntu软件操作的相关命令 sudo apt get update 更新源 sudo apt get install package 安
  • 对AI未来和人类关系的一点思考!

    人 由大脑和身体组成 大脑里存在着人类的意识 身体给大脑提供能量 而这能量是由外界的食物提供的 从而 人体加工食物转化成能量 大脑加工能量 转化成意识 而意识表现在计算能力和创新能力两个方面 计算能力是量变的积累 创新能力是质变的飞跃 创新
  • OSPF实验

    我们坠落 破碎 掉入深渊 但我们终会被托起 被治愈 我们无所畏惧 OSPF部分实验 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 没关系的 大家都会做错选择 会莫名其妙掉眼泪 走在路上会突然崩溃 但这并不影响我们去看
  • 栈越界攻击分析

    1 栈帧简介 之前几期学习分享了关于栈帧系列知识的学习 我们知道函数调用过程中 每一个调用函数都是以栈帧为单位 在其内存空间上做相关操作 每一个调用函数的栈帧存有其返回地址 调用函数结束后 根据返回地址回到上层栈帧空间 直至main 函数的
  • c++访问私有成员变量和私有成员函数的常用方法

    类的对象不能直接访问类声明的私有成员变量 否则破坏了信息隐藏的目的 在C 中 为了防止某些数据成员或成员函数从外部被直接访问 可以将它们声明为private 这样编译器会阻止任何来自外部非友元的直接访问 1 私有成员变量的四种访问方法 1
  • Allegro 为无网络的pin创建并添加网络

    学习笔记 allegro在直接进行PCB绘制而不导入网表的情况 或者在不修改原理图更新网表的情况下 添加无网络的pin并为其创建或指定网络 1 为元件创建网表 logic gt part logic 在 Parts list 添加所需要的元
  • 什么是面向对象编程(OOP)?

    Java 程序员第一个要了解的基础概念就是 什么是面向对象编程 OOP 玩过 DOTA2 一款推塔杀人的游戏 吗 里面有个齐天大圣的角色 欧洲战队玩的很溜 国内战队却不怎么会玩 自家人不会玩自家的神话英雄 实在有点悲哀 我们用 Java 定