java-面向对象技术

java-面向对象技术(万物皆对象)


前言

面向对象是当今软件开发的主流方法之一,它是把数据以及对数据的操作方法放在一起,作为一个相互依存的整体,即对象。对同类对象抽象出其共性,也就是,类中的大多数数据,只能被本类的方法的方法进行处理。类通过一个简单的外部接口与外界发生关系,对象与对象之间通过消息进行通信。程序流程由用户在使用中决定,例如:站在抽象的角度,人具有身高、体重、年龄等一系列特征,人会运动、人会吃饭、人会说话等这样的方法,在这里中人仅仅只是一个抽象的概念,它是不存在的实体,但是所有具备人这个群体的属性与方法的对象都叫人,这个对象人是实际存在的实体,每个人都是人这个群体的对象。


上面的讲解可谓是十分的官方,是的,这个就是比较官方的解释。在程序的设计之初所有的程序都是面向过程的,有句话说的好,万物皆对象,在这个人、动物为主导的世界,如果能够将程序的设计思想与人与自然有关联的话,那么在程序设计以及业务设计的时候就会变得相对来说容易许多,可以有效的扩展程序维护程序。这个也就是面向对象产生的目的。

一、面向过程到面向对象(执行者到指挥者)

  • 什么是面向过程

是一种以事件为中心的开发方法,就是自顶向下顺序执行,逐步求精,其程序结构是按照功能划分为若干个基本板块,这些板块形成一个树状结构,各个模块之间的关系也比较简单,在功能上划分为若干个基本模块,这些模块形成一个树状结构,各个模块之间的关系也比较简单,在功能上相对独立,每个模块内部一般都是由顺序、选择、循环3种基本结构组成的,其模块化实现的具体方法分析问题的步骤:第一步,开始游戏;第二步,黑子先走;第三步,绘制画面;第四步,判断输赢·~~~~~再到白子。这上面的每个步骤一个函数,按照步骤来,这个就是一个面向过程的开发过程

  • 过程到对象(思想的转变)

在面向对象与面向过程两个方面上来说,我觉得是思想上的进步,在我开始学习java的时候就是使用的是面向过程的开发方式,在开发的过程中一个小的项目,就比如上面的五子棋的说明一样,这样的一个项目我用了几百行代码来写,再加上开始时候的编程能力的差劲,导致最重要的问题就是有时候不知道自己在写什么。在之后的项目中使用了面向对象,通过定义对象,可以在不同的情况使用不同的类来进行不同的操作,面向不同的情况使用相对应的对象即可。开始的时候的面向过程,我们更多的是去执行这样的程序逻辑,但是后面的面向对象更多的是指挥者使用什么就用什么。

  • 下面是比较官方的几个方面的不同之处:
  1. 出发点不同。面向对象方法是用符合常规思维的方式来处理客观世界的问题,强调把问题域的要领直接映射到对象及对象之间的接口上。而面向过程方法强调的则是过程的抽象化与模块化,它是以过程为中心构造或处理客观世界问题的。

  2. 层次逻辑关系不同。面向对象方法则是用计算机逻辑来模拟客观世界中的物理存在以对象的集合类作为处理问题的基本单位,尽可能地使计算机世界向客观世界靠拢,以使问题的处理更清晰直接,面向对象方法是用类的层次结构来体现类之间的继承和发展。而面向过程方法处理问题的基本单位是能清晰准确地表达过程的模块,用模块的层次结构概括模块或模块间的关系与功能,把客观世界的问题抽象成计算机可以处理的过程。

  3. 数据处理方式与控制程序方式不同。面向对象方法将数据与对应的代码封装成一个整体,原则上其他对象不能直接修改其数据,即对象的修改只能由自身的成员函数完成,控制程序方式上是通过“事件驱动”来激活和运行程序。而面向过程方法是直接通过程序来处理数据,处理完毕后即可显示处理结果,在控制程序方式上是按照设计调用或返回程序,不能自由导航,各模块之间存在着控制与被控制、调用与被调用的关系。

  4. 分析设计与编码转换方式不同。面向对象方法贾穿于软件生命周期的分析、设计以及编程中,是一种平滑过程,从分析到设计再到编码是采用一致性的模型表示,即实现的是一种无缝连接。而面向过程方法强调分析、设计及编码之间按规则进行转换,贾穿于软件生命周期的分析、设计及编码中,实现的是一种有缝的连接。

  • 面向对象的开发方式有什么优点

1)较高的开发效率。采用面向对象的开发方式,可以对现实的事物进行抽象,可以把现实的事物直接映射为开发的对象,与人类的思维过程相似,岗田线以同时一由于面向对象的开实中的汽车,这种方式非常直观明了,也非常接近人们的止常忠维。时,地H提高软件的开发发方式可以通过继承或者组合的方式来实现代码的重用,因此可以大大地提高软件的开发效率。
2)保证软件的鲁棒性。正是由于面向对象的开发方法有很高的重用性,在开发的过程中可以重用已有的而且在相关领域经过长期测试的代码,因此,自然而然地对软件的鲁棒性起到了良好的促进作用。
3)保证软件的高可维护性。由于采用面向对象的开发方式,使得代码的可读性非常好,同时面向对象的设计模式也使得代码结构更加清晰明了。同时针对面向对象的开发方式,已有许多非常成熟的设计模式,这些设计模式可以使程序在面对需求的变更时,只需要修改部分的模块就可以满足需求,因此维护起来非常方便。

二、面向对象的特征

面向对象的主要特征包括抽象、继承、封装、多态

2.1 抽象:(抽象类与接口)

2.1.1 抽象的概念

抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中一部分,暂时不用部分细节。抽象包括两个方面:一个是过程抽象;一个是数据抽象。

2.1.2 抽象类与接口:自己的理解

抽象类的和抽象总有很多人会问这两个的区别。
在我开始接触java的时候对这样的东西概念理解都是比较少的不知道什么是抽象与接口,当时是为了能够编程而去学习的,对于这样的概念性的东西在我看来可以在实际操作中用就可以了。当时觉得自己一般用不到抽象类,但是接口的话就是在学习springMVC的时候写一个需要有一个mybatis配置文件映射方法的dao层时需要使用接口来定义方法,没有实现,可以定义吧返回值,然后在具体的定义一个它的实现类实现自己定义的方法。嗯嗯,这个就是当时对于抽象类以及接口的看法。

2.1.3 面试的初次体验抽象类与接口

  • 这是一件比较打击的事情,但是没有这样的打击自己还是那个浮的java表面的菜鸡。现在虽然还是菜鸡,但是自己更加的注重的去学习java底层的知识理念。

有一个题是说说抽象类与接口的区别,我直接在百度上面查找了区别(我自己也看不懂)后面的面试官的提问,我直接懵逼。百度的文章说的是很明白,但是对于自己来说真的不知道。也是这样的问题,面试官直接问我那么在简历上面为什么要直接写熟悉java基础,那么这么基础的东西都不能够说清楚。后面他也给我提了建议,说基础多深决定了你能够走多远,正好那几天我在进行一个SpringCloud分布式的项目,他说东西不在于学的多在于学的精,这也是后面自己对于道与术的理解。

2.1.4 那么-什么是抽象类与接口

  • 抽象类在前面说的比较清楚了,这里再说点点:为了代码的可重用性,我们将一些类中相同的方法进行抽取出来放在一个抽象类中,其它的类想用这样的方法就直接继承就可以了。
  • 接口呢?:

接口在我看来就是抽象类的。只是这个接口是用interface修饰的,而抽象类是用abstract修饰的。还有呢?那就是java是单继承,也就是说一个类只能够继承一个类,那么抽象类也是类,也是只能继承一个类,但是在实际的操作中很多的类中的相同的方法可能来自多个抽象类。那怎么办,这个时候接口就产生了,其它的类想用它里面的方法不用继承用实现(implements),那么你又在想了实现(是单实现还是多实现呢?),是多实现,这个也就是接口的产生目的以及与抽象类的区别。
java为了弥补单继承的缺点,提出了接口的多实现来弥补单继承

  • 这里就说这么多,有兴趣可以去看看我之前归纳的java基础。

2.2 继承:

2.2.1 继承的概念

继承是一种联络类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且派生类可以修改或者增加新的方法使之更适合特殊的需要。

  • 继承是面向对象中的一个非常重要的特性。通过继承,子类可以使用父类中的一些成员变
    量与方法,从而能够提高代码的复用性,提高开发效率。在java语言中,被继承的类叫基类(superclass)或者父类,继承基类或者父类的类叫派生类或者子类(subclass)。继承是通过extends关键字来实现的,使用格式为:
class 子类名 extends 父类名

2.2.2 继承的几个特性

  1. Java语言不支持多重继承,也就是说,子类至多只能有一个父类,但是可以通过实现多个接口来达到多重继承的目的。
  2. 子类只能继承父类的非私有( public与 protected)成员变量与方法。
  3. 当子类中定义的成员变量和父类中定义的成员变量同名时,子类中的成员变量会覆盖父类的成员变量,而不会继承。
  4. 当子类中的方法与父类中的方法有相同的函数签名(相同的方法名,相同的参数个数与类型)时,子类将会覆盖父类的方法,而不会继承。
  • 常见笔试题:

下列有关继承的说法中,正确的是()
A.子类能继承父类的所有方法和状态
B.子类能继承父类的非私有方法和状态
C.子类只能继承父类 public方法和状态
D.子类能继承父类的方法,而不是状态
答案:B

2.3 封装:

封装是指将客观事物抽象成类,每个类对自身的数据和方法实行保护。类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息的隐藏。

2.4 多态:

2.4.1 多态的概念

多态是指允许不同的类的对象对同一消息作出响应。多态包括参数化多态和包含多态。多态语言具有灵活、抽象、行为共享、代码共享等优势,很好地解决了应用程序函数同名问题。

2.4.2 多态的实现机制

  • 多态是面向对象程序设计中代码重用的一个重要机制,它表示当同一个操作作用在不同对象时,会有不同的语义,从而会产生不同的结果,例如:同样是执行“+”操作,“3+4”用来实现整数相加,而“3”+“4”却实现了字符串的连接。在java语言中,多态主要有以下两种表现方式:
  1. 方法的重载(overload)。

重载是指同一个类中有多个同名的方法,但这些方法有着不同的参数,因此在编译时就可以确定到底调用哪个方法,它是一种编译时多态。重载可以被看作一个类中的方法多态性。

  1. 方法的覆盖(override)【重写】。

子类可以覆盖父类的方法,因此同样的方法会在父类与子类中有着不同的表现形式。在Java语言中,基类的引用变量不仅可以指向基类的实例对象,也可以指向其子类的实例对象。同样,接口的引用变量也可以指向其实现类的实例对象。而程序调用的方法在运行期才动态绑定(绑定指的是将一个方法调用和一个方法主体连接到一起),就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,是引用变量的类型中定义的方法。通过这种动态绑定的方法实现了多态。由于只有在运行时才能确定调用哪个方法,因此通过方法覆盖实现的多态也可以被称为运行时多态

  • 只有类中的方法才有多态的概念,类中成员变量没有多态的概念。

三、重载和重写(覆盖、覆写)的区别

  • 重载( overload)和覆盖(override)是Java多态性的不同表现方式。其中,重载是在一个类中多态性的一种表现,是指在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型。在使用重载时,需要注意以下几点:

1)重载是通过不同的方法参数来区分的,例如不同的参数个数、不同的参数类型或不同的参数顺序。
2)不能通过方法的访问权限、返回值类型和抛出的异常类型来进行重载。
3)对于继承来说,如果基类方法的访问权限为private,那么就不能在派生类对其重载;如果派生类也定义了一个同名的函数,这只是一个新的方法,不会达到重载的效果。

  • 覆盖是指派生类函数覆盖基类函数。覆盖一个方法并对其重写,以达到不同的作用。在使用覆盖时需要注意以下几点:

1)派生类中的覆盖方法必须要和基类中被覆盖的方法有相同的函数名和参数。
2)派生类中的覆盖方法的返回值必须和基类中被覆盖白方法的返回值相同。补县向详其3)派生类中的覆盖方法所抛出的异常必须和基类(或是其子类)中被覆盖的方法所抛出的异常一致。
4)基类中被覆盖的方法不能为private,否则其子类只是定义了一个方法,并没有对其覆盖。

  • 重载与覆盖的区别主要有以下几个方面:

1)覆盖是子类和父类之间的关系,是垂直关系;重载是同一个类中方法之间的关系,是水平关系。
2)覆盖只能由一个方法或只能由一对方法产生关系;重载是多个方法之间的关系。
3)覆盖要求参数列表相同;重载要求参数列表不同。
4)覆盖关系中,调用方法体是根据对象的类型(对象对应存储空间类型)来决定;而重载关系是根据调用时的实参表与形参表来选择方法体的。


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值