面向对象的理解及相关概念(封装,继承,多态)

前言

面向对象程序设计(OOP)是当今主流的程序设计范性,它取代了结构化或过程式编程技术。

一、面向对象是什么?

1、定义:

面向对象就是:把数据及对数据的操作方法放在一起,作为一个相互依存的整体——对象。对同类对象抽象出其共性,形成类。类中的大多数数据,只能用本类的方法进行处理。类通过一个简单的外部接口与外界发生关系,对象与对象之间通过消息进行通信。程序流程由用户在使用中决定。对象即为人对各种具体物体抽象后的一个概念,人们每天都要接触各种各样的对象,如手机就是一个对象。
java中有一个概念就是万物皆可对象。
面向对象的程序是由对象组成的,每个对象包含用户公开的特定的功能部分和隐藏的实现部分。
面向对象更适合解决规模更大的问题,举个例子:
要想实现一个简单的web浏览器可能需要大约2000个过程,这些过程需要对一组全局操作进行操作,采用面向对象的思想,可能大约只需要100个类,每个类平均包含20个方法。后者更易于程序员掌握,也容易找到bug。

2、优点(重要):

1、易维护
采用面向对象思想设计的结构,可读性高,由于继承的存在,即使改变需求,那么维护也只是在局部模块,所以维护起来是非常方便和较低成本的,上文也说了容易找bug。
2、质量高
在设计时,可重用现有的,在以前的项目的领域中已被测试过的类使系统满足业务需求并具有较高的质量。
3、效率高
在软件开发时,根据设计的需要对现实世界的事物进行抽象,产生类。使用这样的方法解决问题,接近于人日常生活和自然的思考方式,势必提高软件开发的效率和质量。
4、易扩展
由于继承、封装、多态的特性,自然设计出高内聚、低耦合的系统结构,使得系统更灵活、更容易扩展,而且成本较低。

3、对象的特性

对象的行为:可以对象的完成哪些操作或者可以对对象应用那些方法?
对象的状态:每个对象都保存着当前状况的信息。对象的状态可以随着时间而改变,但不是自发的,必须通过调用方法实现,不然就破坏了封装性。
对象的标识:如何区分具有相同行为和状态的不同对象? 每个对象都有唯一的标识。作为同一个类的实例。每个对象的实例标识总是不同的。

4、与面向过程的区别

在这里插入图片描述

二、类

1、类的定义:

类是构造对象的模板和蓝图。我们可以把类看作制造小饼干的模具,那么对象就是小饼干。
由类构造对象的过程是被称为构建类的实例。

2、封装

封装从形式看,就是将数据和行为组合在一个包中,并对对象的使用者隐藏具体的实现方式。
实现封装的关键在于绝不能让类中的方法去直接访问其他类的实例字段。程序只能通过对象的方法与对象数据进行交互。
封装给对象赋予了黑盒特征,这是提高了重用性和可靠性。

3、继承

基本思想就是基于已有的类创造新的类,继承已存在的类就是复用这些类的方法,而且增加一些新的方法和字段,使新类适应新的情况。

三、多态(重点来喽)

1、多态的定义:

面向对象的三大特性:封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态而准备的。这是我们最后一个概念,也是最重要的知识点。
多态的定义:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)
多态是基于替换原则,他指出程序出现超类对象的任何地方都可以用子类对象替换。

2、条件和技术

多态存在的三个必要条件
一、要有继承;
二、要有重写;
三、父类引用指向子类对象。(及如果父类的方法被子类重写,运用子类的方法)

实现多态的技术称为:动态绑定(下面有补充)

3、运行时多态和编译时多态(重要):

其实从java多态的定义来说编译多态并不能真正算做多态,有时候我们也叫他静态多态性
编译时多态主要指的是函数的重载,例如有一个类这个C有一个方法F,但是同时存在F(int),和F(String),当我们的代码中有c.F(param)时,编译器会将C类中说有名为F的方法和父类中属性为public且名为F的方法。接下来编译器会查看param的类型,比如c.F(“hello”)就会挑选F(String)而不是F(int),如果调用c.F(1),编对应的译器就会选择F(int)。如果挑选不到对应的方法或者多个方法对应就会报错。(基于方法的重载)
运行时多态性:
运行时多态性主要运用到动态绑定。就是在运行时动态的确定调用的是哪一个函数。比如:如果A有多个之类,每个子类都有f(Stirng)方法,当我们声明一个A的对象a,对它用不同的子类进行不同的实例化。这样这个方法可以产生不同的效果,也就是实现了多态。(基于方法的重写)

4、多态的好处:

1.可替换性(substitutability)。多态对已存在代码具有可替换性。例如,draw函数对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。
2.可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。
3.接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。
4.灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。
5.简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。

四、补充:程序绑定

1、程序绑定的概念:

绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来。对java来说,绑定分为静态绑定和动态绑定;或者叫做前期绑定和后期绑定.

2、静态绑定:

在程序执行前方法已经被绑定(也就是说在编译过程中就已经知道这个方法到底是哪个类中的方法),此时由 编译器或其它连接程序实现。例如:C。
针对java简单的可以理解为程序编译期的绑定;这里特别说明一点,java当中的方法只有final,static,private和构造方法是前期绑定

3、动态绑定:

后期绑定: 在运行时根据具体对象的类型进行绑定。
若一种语言实现了后期绑定,同时必须提供一些机制,可在运行期间判断对象的类型,并分别调用适当的方法。也就是说, 编译器此时依然不知道对象的类型,但方法调用机制能自己去调查,找到正确的方法主体。不同的语言对后期绑定的实现方法是有所区别的。但我们至少可以这样认为:它们都要在对象中安插某些特殊类型的信息。
动态绑定的过程:
1.虚拟机提取对象的实际类型的方法表;
2.虚拟机搜索方法签名;
3.调用方法。

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值