0基础java入门:第二十五节.面向对象思想理解思路。

2023-10-29

0基础java入门:第二十五节.面向对象思想理解思路。(本章需要时间和代码积累才能理解通透 不要着急 先来了解 敲上三年代码再回来看)

面向对象是现在大部分编程语言中都会提及和使用到的一种思想方式。有人说很难理解,但个人觉得其实不难。因为面向对象本身是更贴近现实生活的思考方式。比如,当我们想要一辆汽车,首先想到的是找到一个卖车的商店。这里的商店就是一个对象,这个商店对象的功能就是售卖汽车。通过商店可以获得汽车。这种思考方式的核心是什么我们在之后的内容中逐步分析。

面向对象与面向过程

首先我们先来了解以下编程思想中的面向过程和面向对象两种方式的不同。

面向过程 : (Procedure Oriented)是一种以过程为中心的编程思想。以步骤未核心考虑先后执行顺序,完成某一件事情。如果某些步骤发生问题,可能需要重新开始。

面向对象 : (Object Oriented) 是一种以对象未中心的编程思想。以某个对象的某个功能能帮我完成什么事情为核心,思考如何完成一件事情。如果对象出现问题可以考虑更换对象。

以上的概念是自己理解的。单个人认为这就是面向对象和面向过程的核心思想。比较抽象,下面举例说明。

比如我饿了 ,想吃一桶泡面:

      面向过程思考:首先需要 买泡面 --> 需要搞到开水 -->泡面-->等待-->吃泡面。

                                   这时关键步骤 比如在等待期间 我的猫 不小心把 面 打翻了,我如果还想吃 需要从头再来一边。

      面向对象思考:首先思考 找到可以提供 泡好的面的服务的对象。如 饭店 或者下铺的兄弟。让他去帮我泡一个面。

                                   这时如果对象出现了问题 比如饭店 没有泡面了 我们还想吃 可以考虑换一家饭店。

通过上边的例子我们可以简单体会一下 ,面向对象和面向过程思考方式的不同。但是注意思想没有高低好坏之分。并且面向对象和面向过程是不可分离的。我们不能说一个程序都只是面向对象或都只是面向过程的。面向对象可以使我们在处理和思考业务的时候变得更简单。但是面向对象其实也是基于面向过程的。比如我们在例子中 找到了提供泡面的对象,之后只是我们不考虑泡面的步骤了,但是饭店还是需要考虑这个步骤的,这个步骤是依然存在的。

类与对象的关系

两个简单的概念 ,更抽象向。

类 : 是对具有相同特性事物的抽象描述。(可以描述拥有是那些特性 但是不能具体)

      简单解释一下类 :比如 人类 就是一个类 ,人类描述了我们所有的人,并且我们都有一些相同的特性。比如人都有 姓名 年龄 身高 体重 等信息。

                                    比如 汽车类  也是一个类 , 汽车类描述了所有汽车。 比如 汽车都有品牌 颜色 ,排量 ,轴距 等信息。拥有移动 加速 停车 等功能。

对象: 是符合类特性的具体事物。(可以描述 特性的具体值)

     简单解释一下对象 :比如 人类中的一个对象  我的同事 王小明 。他的 身高 180 体重 70公斤 年龄 36岁

                                       比如 汽车类的一个对象  王小明的车子 。是一台 白色 宝马 排量2.0 轴距1.7米 可以 移动 家属 和停车。

                                      注意 : 这里一定不要进入一个误区  男人 女人 不是对象 还是类 。可以认为是人类中的两个子类。男人和女人的信息是不能具体的。

通过上边的解释,可以了解类和对象的关系是相互衍生的。当拥有共同特性的多个事物在一起是统称为类。而这类中的具体一个事物就叫做对象。一个类中是可以拥有多个对象的,并且每一个对象都是相互独立的。可以这样理解,人类中包含了你 我 她 以及你的家人和同事,如果我改了名字对其他人是没有影响的。

如何描述一个类

在程序中我们是需要先描述类,之后通过类生成对象的。那么我们怎么描述一个类呢?描述一个类主要描述它的两个方面,第一方面静态的属性,第二方面动态的功能或动作。静态属性理解为可以用一个值表示的特性。动态的功能和动作可以理解为一个复杂的过程,不能用一个值来表示。

比如:  老师类    

           属性 :  姓名  教龄   性别   职务  等... ...

           功能 : 讲课  检查作业 等... ...

上边老师类的 属性中 姓名=张三  性别 = 男    职位=金牌讲师  教龄 = 6年  这些是可以用一个值表示的 属性。

而 讲课 检查作业等是一系列给动作 不能用简单的值表示。是一个功能。

在代码中我们 的属性用 成员变量 表示 ,功能用成员方法表示

代码演示:

package com.test.demo;

// 这个类 用来描述 老师类 不需要主函数执行
public class Teacher {
	// 成员变量
	String name; // 老师姓名
	int year;// 教龄
	boolean sex;// 性别
	String post;// 职务
	
	// 成员方法
	public void tock(){
		System.out.println("老师在讲课");
	}
	public void check(){
		System.out.println("老师在检查作业");
	}
}

以上实在代码中如何表示一个类的特性。后边我们会反复使用到的。

类与对象在程序中的用途

类的做用主要是用来描述我们业务中需要处理的信息样式和功能的标准。对象是用来具体存储信息和执行功能的。当然我们并不是毫无目的的将所有的类属性都描述出来,只需要描述业务中我们需要处理的和使用的特性就可以。比如老师 也是有身高 体重等特性,和吃饭 睡觉等方法的,但是我们在业务中对这些特性么有使用和处理也就不需要描述了。


以下内容 适当阅读,如果不理解,可以先记下 三大特点和五大基本原则大概是说明就可以。

内容转载于 :风之之

网址:https://www.cnblogs.com/fzz9/p/8973315.html#%E3%80%80%E3%80%801%E5%8D%95%E4%B8%80%E8%81%8C%E8%B4%A3%E5%8E%9F%E5%88%99srp

面向对象的特性

面向对象的三大特点 : 封装  继承  多态。

封装:

       封装就是隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别,将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。

  封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,以特定的访问权限来使用类的成员。

  面相对象的不就是使用程序处理事情时以对象为中心去分析吗,与面向过程不同,面向过程关心处理的逻辑、流程等问题,而不关心事件主体。而面向对象即面向主体,所以我们在解决问题时应该先进行对象的封装(对象是封装类的实例,比如张三是人,人是一个封装类,张三只是对象中的一个实例、一个对象)。比如我们日常生活中的小兔子、小绵羊都可以封装为一个类。

 比如兔子的属性有两只耳朵、四只腿、一双眼睛、三瓣嘴等;行为(功能)有跑、跳、吃素等。

继承:

 继承是面向对象的基本特征之一,继承机制允许创建分等级层次的类。继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。类似下面这个图:

 我们在上面已经封装了兔子这个类,其他动物也一样可以进行封装。在封装过程中我们发现兔子、绵羊这两个类具有相似的功能或特性如吃草,所以我们可以抽取共有特征和方法形成高一层的类,如这里的食草动物、食肉动物。继承之间是子父类的关系。继承机制可以很好的描述一个类的生态,也提高了代码复用率,在Java中的Object类是所有类的超类,常称作上帝类。

多态:

        多态同一个行为具有多个不同表现形式或形态的能力。是指一个类实例(对象)的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。

多态的优点:

  • 1. 消除类型之间的耦合关系
  • 2. 可替换性
  • 3. 可扩充性
  • 4. 接口性
  • 5. 灵活性
  • 6. 简化性

  多态存在的三个必要条件

  • 继承
  • 重写(子类继承父类后对父类方法进行重新定义)
  • 父类引用指向子类对象

  简言之,多态其实是在继承的基础上的。比如说今天我们要去动物园参观动物,那么你说我们去参观兔子、参观绵羊、参观狮子、参观豹子都是对的,但你不能说我们去参观汽车。在这个例子中,子类具有多态性:除了使用自己的身份,还能充当父类。

五大基本原则

面向对象的五大基本原则:单一职责原则(SRP),开放封闭原则(OCP),里氏替换原则(LSP),依赖倒置原则(DIP),接口隔离原则(ISP)

  1、单一职责原则(SRP)

  一个类应该有且只有一个去改变它的理由,这意味着一个类应该只有一项工作。

  比如在职员类里,将工程师、销售人员、销售经理这些情况都放在职员类里考虑,其结果将会非常混乱,在这个假设下,职员类里的每个方法都要if else判断是哪种情况,从类结构上来说将会十分臃肿。

  2、开放封闭原则(OCP)

  对象或实体应该对扩展开放,对修改封闭。

  更改封闭即是在我们对模块进行扩展时,勿需对源有程序代码和DLL进行修改或重新编译文件!这个原则对我们在设计类的时候很有帮助,坚持这个原则就必须尽量考虑接口封装,抽象机制和多态技术!

  3、里氏替换原则(LSP)

  在对象 x 为类型 T 时 q(x) 成立,那么当 S 是 T 的子类时,对象 y 为类型 S 时 q(y) 也应成立。(即对父类的调用同样适用于子类)

  4、依赖倒置原则(DIP)

  高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。具体实现应该依赖于抽象,而不是抽象依赖于实现。

  可以这样理解,上面我举例子的时候先说了兔子和绵羊,然后才推出食草动物。但如果我们继续认识了牛、马等食草动物,我们会发现我们需要不断调整食草动物的描述,这样程序会变得僵化,所以我们不应该让子类依赖于实体,不应该让父类模块依赖于子类模块。所以我们需要将食草动物设计为抽象类,即抽象类或接口。这样下层只需要实现相应的细节而不会影响父类。

  5、接口隔离原则(ISP)

  不应强迫客户端实现一个它用不上的接口,或是说客户端不应该被迫依赖它们不使用的方法,使用多个专门的接口比使用单个接口要好的多!

  比如,为了减少接口的定义,将许多类似的方法都放在一个接口中,最后会发现,维护和实现接口的时候花了太多精力,而接口所定义的操作相当于对客户端的一种承诺,这种承诺当然是越少越好,越精练越好,过多的承诺带来的就是你的大量精力和时间去维护!

  这些基本原则需要我们在使用面向对象编程中慢慢领会、总结。

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

0基础java入门:第二十五节.面向对象思想理解思路。 的相关文章

  • 如何使用 Java 和 Selenium WebDriver 在 C 目录中创建文件夹并需要将屏幕截图保存在该目录中?

    目前正在与硒网络驱动程序和代码Java 我有一种情况 我需要在 C 目录中创建一个文件夹 并在该文件夹中创建我通过 selenium Web 驱动程序代码拍摄的屏幕截图 它需要存储在带有时间戳的文件夹中 如果我每天按计划运行脚本 所有屏幕截
  • 为什么 i++ 不是原子的?

    Why is i Java 中不是原子的 为了更深入地了解 Java 我尝试计算线程中循环的执行频率 所以我用了一个 private static int total 0 在主课中 我有两个线程 主题 1 打印System out prin
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • 无法解析插件 Java Spring

    我正在使用 IntelliJ IDEA 并且我尝试通过 maven 安装依赖项 但它给了我这些错误 Cannot resolve plugin org apache maven plugins maven clean plugin 3 0
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • 在 Mac 上正确运行基于 SWT 的跨平台 jar

    我一直致力于一个基于 SWT 的项目 该项目旨在部署为 Java Web Start 从而可以在多个平台上使用 到目前为止 我已经成功解决了由于 SWT 依赖的系统特定库而出现的导出问题 请参阅相关thread https stackove
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • Java执行器服务线程池[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我使用 Executor 框架在
  • Google App Engine 如何预编译 Java?

    App Engine 对应用程序的 Java 字节码使用 预编译 过程 以增强应用程序在 Java 运行时环境中的性能 预编译代码的功能与原始字节码相同 有没有详细的信息这是做什么的 我在一个中找到了这个谷歌群组消息 http groups
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • 编译器抱怨“缺少返回语句”,即使不可能达到缺少返回语句的条件

    在下面的方法中 编译器抱怨缺少退货声明即使该方法只有一条路径 并且它包含一个return陈述 抑制错误需要另一个return陈述 public int foo if true return 5 鉴于Java编译器可以识别无限循环 https
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • 有没有办法为Java的字符集名称添加别名

    我收到一个异常 埋藏在第 3 方库中 消息如下 java io UnsupportedEncodingException BIG 5 我认为发生这种情况是因为 Java 没有定义这个名称java nio charset Charset Ch
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List
  • 使用 xpath 和 vtd-xml 以字符串形式获取元素的子节点和文本

    这是我的 XML 的一部分

随机推荐

  • windows Server 2012 R2安装部署

    Windows Server 2012 R2 是基于Windows8 1 以及Windows RT 8 1 界面的新一代 Windows Server 操作系统 提供企业级数据中心和混合云解决方案 易于部署 具有成本效益 以应用程序为重点
  • Delphi 通过TNetHTTPClient访问http,最新解析快手无水印视频地址链接方法

    一 解析快手无水印视频链接原理 共分三个步骤 1 通过视频分享获得视频地址短链接 如 https www kuaishou com f X7tIV0jIivYUyTk 2 通过TNetHTTPClient重定向获得视频地址长链接 如 htt
  • 把桌面从C盘改到D盘,结果直接让D盘变成了桌面,改回去发现图标变少了

    昨天晚上我一时兴起想把我电脑桌面的位置改到D盘 然后我就打开了它的属性 把位置改了 点了 应用 后弹出来一个弹窗 询问我 是否要将所有文件从原位置移动到新位置 我点了 是 其实正常来讲只要你那个新位置是个文件夹就可以 但是我当时不知道 我没
  • JavaSHA-256加解密

    Java中可以使用java security MessageDigest类来进行SHA 256加密 以下是一个使用SHA 256加密字符串的示例代码 import java security MessageDigest public cla
  • IBM发布基于OpenStack的服务

    原文地址 http www csdn net article 2013 03 05 2814349 IBM lunch service based on OpenStack 时隔13年后 IBM再一次拥抱开源 这一次 是被称为21世纪Lin
  • spi设备驱动

    include
  • iOS第三方支付集成-微信支付

    序言 说来惭愧 终于有支付的需求给我做了 哇嘎嘎 开动 文章尽量写的详细点 从自身出发 希望能给大家一点帮助 欢迎大佬指正 支付流程 步骤1 用户在商户APP中选择商品 提交订单 选择微信支付 步骤2 商户后台收到用户支付单 调用微信支付统
  • hdlm 5.9在hacmp中的配置

    hdlm 5 9是hds多路径软件最新版本的 它与以前版本有不小的改进 比如以前一个ldev 如果有4个通道 那么在os上面可以看到4个hdisk 然后这个hdisk再组成一个dlmfdrv 在5 9中只有一个hdisk 没有dlmfdrv
  • 音视频编码类型

    H264 格式介绍 avcc 前四个字节表示nalu的size 大端 Annex B 0x000001或者0x00000001开始码 nalu针对0x000000 0x000001 0x000002和0x000003插入0x03防竞争字节
  • IDEA导入Eclipse项目步骤详解

    IDEA导入Eclipse项目步骤详解 文章目录 IDEA导入Eclipse项目步骤详解 首先在idea里file gt new gt Project from Existing Sources 选中到要导入的项目 这里我选用创建新的 Cl
  • 情感分析概述

    情感分析主要研究观点挖掘 倾向性分析等 一 为什么需要观点挖掘和倾向性分析 文本信息主要包括两类 客观性事实 主观性观点 但是已有的文本分析方法主要侧重在客观性文本内容的分析和挖掘 二 什么是观点挖掘与倾向性分析 观点挖掘与倾向性分析就是从
  • Java多线程进阶(十九)—— J.U.C之synchronizer框架:CyclicBarrier

    本文首发于一世流云专栏 https segmentfault com blog 一 CyclicBarrier简介 CyclicBarrier是一个辅助同步器类 在JDK1 5时随着J U C一起引入 这个类的功能和我们之前介绍的Count
  • Jmeter录制脚本

    性能关注点 接口响应时间 50毫秒 1000毫秒 吞度量 10000万每天 tPs 每秒处理事务数 压测需求与业务操作步骤 压测对象 http news baidu com 压测页面 首页 国际频道 财经频道 步骤 访问首页 单击 国际频道
  • 测试用例的优先级

    刚接触软件测试 先熟悉一下测试用例的优先级的概念 有时会听到0级别case的说法 其实这是对具有一定优先级的测试用例的说法 在这际测试实践中 测试用例根据重要性分成一定的等级 在不通的公司 可能测试用例的等级划分有所差异 但是基本大同小异
  • 积分计算两条曲线围绕y坐标轴旋转形成的立体体积

    积分计算两条曲线围绕y坐标轴旋转形成的立体体积 和附录文章1类似 计算两条曲线y x 2和y 2x围绕y坐标轴形成的立方体体积 首先要计算积分的上限和下限 根据两者相交的点求出 0 4 外层大圆R y y 1 2 和内层小圆r y y 2的
  • 使用iptables进行入站流量过滤

    iptables是Linux内置的流量过滤工具 同时也是多种防火墙的底层实现 如fw3 在本次应用中 iptables通过丢弃不符合规则的数据包 使得未注册设备在DHCP获取ip阶段失败 无法连接到专用内网 保证系统安全 iptables使
  • 10年软件测试工程师感悟——写给还在迷茫中的朋友

    这两天和朋友谈到软件测试的发展 其实软件测试已经在不知不觉中发生了非常大的改变 前几年的软件测试行业还是一个风口 随着不断地转行人员以及毕业的大学生疯狂地涌入软件测试行业 目前软件测试行业 缺口 已经基本饱和 当然 我说的是最基础的功能测试
  • QT之D指针

    什么是D指针 如果你已经看过到Qt源码 你会发现它经常使用Q D和Q Q 宏 本文介绍了这些宏的用途 该Q D和Q Q宏是一个设计模式的一部分被称为d 指针 也称为 不透明的指针 其中一个库的实现细节可以从它的用户 并转移到执行被隐藏 另外
  • LLVM每日谈之二 LLVM IR

    作者 snsn1984 在介绍LLVM IR之前 我们需要先了解下LLVM的结构 传统的静态编译器分为三个阶段 前端 优化和后端 LLVM的三阶段设计是这样的 这样做的优点是如果需要支持一种新的编程语言 那么我们只需要实现一种新的前端 如果
  • 0基础java入门:第二十五节.面向对象思想理解思路。

    0基础java入门 第二十五节 面向对象思想理解思路 本章需要时间和代码积累才能理解通透 不要着急 先来了解 敲上三年代码再回来看 面向对象是现在大部分编程语言中都会提及和使用到的一种思想方式 有人说很难理解 但个人觉得其实不难 因为面向对