面向对象之拥抱对象

什么是面向对象?

  • 面向对象是一种编程思想。把万物抽象成一个个个体,需要这个个体才拿来用。

为什么需要面向对象?

面向对象是为了解决系统的可维护性,可扩展性,可重用性,我们再进一步思考,面向对象为什么能解决系统的可维护性,可扩展性,可重用性?

面向对象产生的历史原因有下面两点:

1、 计算机是帮助人们解决问题的,然而计算机终究是个机器,他只会按照人所写的代码,一步一步的执行下去,最终得到了结果,因此无论程序多么的复杂,计算机总是能轻松应付。结构化编程,就是按照计算机的思维写出的代码,但是人看到这么复杂的逻辑,就无法维护和扩展了。

2、 结构化设计是以功能为目标来设计构造应用系统,这种做法导致我们设计程序时,不得不将客体所构成的现实世界映射到由功能模块组成的解空间中,这种转换过程,背离了人们观察和解决问题的基本思路。

可见结构化设计在设计系统的时候,无法解决重用、维护、扩展的问题,而且会导致逻辑过于复杂,代码晦涩难懂。于是人们就想,能不能让计算机直接模拟现实的环境,用人类解决问题的思路、习惯、步骤来设计相应的应用程序?这样的程序,人们在读它的时候,会更容易理解,也不需要再把现实世界和程序世界之间来回做转换。

与此同时,人们发现,在现实世界中存在的客体是问题域中的主角。所谓客体是指客观存在的对象实体和主观抽象的概念,这种客体具有属性和行为,而客体是稳定的,行为是不稳定的,同时客体之间具有各种联系,因此面向客体编程,比面向行为编程,系统会更稳定。在面对频繁的需求更改时,改变的往往是行为,而客体一般不需要改变,所以我们就把行为封装起来,这样改变时候只需要改变行为即可,主架构则保持了稳定。

于是面向对象就产生了。

然而人们追求的系统可维护性,可扩展性,可重用性又是怎么在面向对象中体现出来的呢?

首先看看面向对象的三大特征:

封装:找到变化并且把它封装起来,你就可以在不影响其它部分的情况下修改或扩展被封装的变化部分,这是所有设计模式的基础,就是封装变化,因此封装的作用,就解决了程序的可扩展性。

继承:子类继承父类,可以继承父类的方法及属性,实现了多态以及代码的重用,因此也解决了系统的重用性和扩展性。但是继承破坏了封装,因为他是对子类开放的,修改父类会导致所有子类的改变,因此继承一定程度上又破坏了系统的可扩展性,所以继承需要慎用。只有明确的IS-A关系才能使用,同时继承在在程序开发过程中重构得到的,而不是程序设计之初就使用继承,很多面向对象开发者滥用继承,结果造成后期的代码解决不了需求的变化了。因此优先使用组合,而不是继承,是面向对象开发中一个重要的经验。

多态:接口的多种不同的实现方式即为多态。接口是对行为的抽象,刚才在封装提到,找到变化部分并封装起来,但是封装起来后,怎么适应接下来的变化?这正是接口的作用,接口的主要目的是为不相关的类提供通用的处理服务,我们可以想象一下。比如鸟会飞,但是超人也会飞,通过飞这个接口,我们可以让鸟和超人,都实现这个接口,这就实现了系统的可维护性,可扩展性。

因此面向对象能实现人们追求的系统可维护性,可扩展性,可重用性。面向对象是一种编程思想,起初,“面向对象”是专指在程序设计中采用封装、继承、多态等设计方法,但面向对象的思想已经涉及到软件开发的各个方面,比如现在细分为了面向对象的分析(OOA),面向对象的设计(OOD),面向对象的编程实现(OOP)

如何实现面向对象?

面向对象是一种思想,他让我们在分析和解决问题时,把思维和重点转向现实中的客体中来,然后通过UML工具理清这些客体之间的联系,最后用面向对象的语言实现这种客体以及客体之间的联系。它分为面向对象的分析(OOA),面向对象的设计(OOD),面向对象的编程实现(OOP)三个大的步骤。

  1. 首先是分析需求,先不要思考怎么用程序实现它,先分析需求中稳定不变的客体都是些什么,这些客体之间的关系是什么。

  2. 把第一步分析出来的需求,通过进一步扩充模型,变成可实现的、符合成本的、模块化的、低耦合高内聚的模型。

  3. 使用面向对象的实现模型

什么是面向过程?

  • 面向过程是一种编程思想。为实现某一功能,通过一定顺序配合函数来实现这个功能。

面向对象的特性有哪些?

  1. 封装
    • 把一个类的特征包装起来,不暴露给外界,通过调用方法/接口访问这个类。很安全。
  2. 继承
    • 比如说猫的父类是动物类,猫具有动物的特征。
    • 遵循里氏原则LSP:子类对象必须能够替换掉所有父类对象
  3. 多态
    • 程序具有多种状态。
    • 运行时多态:指程序中定义的对象引用所指向的具体类型在运行期间才确定。
    • 编译时多态:指方法的重载。

为什么需要封装?

说封装,咱们先说说生活中的封装,比如你想买一个手机用,你只在淘宝下单就可以了,这个手机怎么生产的,里边的代码怎么写的,你不需要了解,这就是封装,也就是厂家直接把手机给你封装好,你掏钱用就可以了。
信息隐藏:封装隐藏了类的具体实现细节,只暴露必要的接口给外部使用。这样可以防止外部直接访问和修改类的内部数据,使得类的使用者只需关注如何使用接口,而无需关心具体的实现细节。这提供了更好的安全性和灵活性。

  1. 代码隔离:封装将数据和相关操作封装在一个单元中,形成了一个独立的实体,这样可以根据功能划分代码模块,使得代码更加清晰、结构化。不同的模块之间相互独立,修改一个模块不会影响其他模块,提高了代码的可维护性和可复用性。

  2. 简化复杂性:封装通过将复杂的内部实现隐藏起来,只提供简单的接口给外部使用,使得外部使用者无需了解实现细节和复杂性,降低了代码使用的复杂度,提高了代码的可理解性和易用性。

  3. 版本控制:封装可以为类的内部实现提供版本控制的支持。当需要修改或升级类的内部实现时,只需保持对外的接口不变,内部实现可以自由调整,而不会影响到外部使用者,从而实现了代码的平滑升级和迭代。

如何实现封装?

  1. 使用访问控制符:在面向对象编程中,使用访问控制符来限制对类的属性和方法的访问权限是实现封装的一种方法。通过将属性和方法声明为私有,公共或受保护,您可以控制这些成员的可见性。在Java中,私有成员只能从类的内部访问,而公共成员可以从任何地方访问。受保护的成员可以从同一包中的类或从继承类中访问。例如,我们可以声明一个私有成员变量,并为其提供一个公共的setter和getter方法。这样,其他类只能通过这些公共方法来访问这个私有成员。

  2. 使用接口:另一种实现封装的方法是使用接口。接口是一个结构,它定义了一个或多个方法的集合。通过实现一个接口,您可以向外部模块提供一个API,它只暴露了必要的方法,而隐藏了实现细节。在Java中,您可以使用接口来定义一个API,该API只呈现一些公共方法,并将实现细节隐藏。这样,您可以确保您的应用程序只能访问这些公共方法,并且不会对其实现细节造成任何影响。

  3. 使用对象:通过使用对象,您可以将数据和相关方法封装到一个单独的实体中,并防止其他对象对该对象进行不合适的访问。对象具有状态和行为,并使用方法来操作它们。在Java中,您可以创建一个类来代表一个对象,并在类中定义公共方法来访问和操作它的状态。例如,我们可以创建一个名为Person的类,并在其内部定义变量和方法来代表一个人。

为什么需要继承?

  1. 代码重用:通过继承,子类可以重用父类的属性和方法,减少了代码的重复编写,提高了代码的可维护性和可读性。
  2. 扩展性:继承为类的扩展提供了一种灵活的方式。当需要对一个已有的类进行扩展时,可以通过继承来创建一个新的子类,而不需要修改原有的类。
  3. 模块化:继承有助于将类的功能分解为更小的、可管理的模块。每个子类可以专注于实现特定的功能,而共享的功能则由父类提供。
  4. 多态:继承还允许子类覆盖或重新实现父类的方法,从而实现多态。多态允许我们在运行时根据对象的实际类型来调用相应的方法,提高了代码的灵活性。

Java如何实现继承?

  • 在Java中,继承是通过extends关键字来实现的.

什么是多态?

  • 多态就是同一个方法调用,由于对象不同可能会有不同的行为

为什么需要多态?

  • 大大的提高了程序的扩展性。

如何实现多态?

    1. 继承:继承是实现多态的基础,通过继承可以定义一个父类,然后在子类中重载父类的方法,从而实现不同的行为。
  1. 接口:接口是一种规范,规定了一组行为和属性,但是并不实现。通过实现接口,可以达到多态的效果。
  2. 泛型:泛型是一种通用的数据类型,可以在不同的情况下代表不同的类型。通过泛型,可以达到在不同情况下实现多态的目的。
  • 24
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值