Java面向对象概述
经过Java启蒙阶段,我们已经对Java有了一些了解,也安装好了Java IDE环境,下面离日敲代码万行、成为程序员大神就剩下最后“一公里”了,可是,这一公里不是说走就走的旅行,还是得一步一个脚印、踏实地走。
本章开始,我们正式进入Java初级阶段,概念性的东西较多,学会理解性地记忆,可以达到事半功倍的效果,以后结合代码就更容易明白了。(千万别死记硬背,如果这是你的习惯,我用单身的精神佩服你)
我们之前也了解到Java是面向对象的开发语言,可什么是面向对象呢???(我没有对象,我该朝哪面)
大自然的一草一木、一虫一鸟、一山一石、一场雨、一缕风、一袭阳光 ……都是我们实实在在看见的感受到的“东西”,并且根据我们自己的认知与想象给这些“东西”都赋予了具体的名字,从而出现了狗尾巴草、松树、七星瓢虫、蜂鸟、黄山、陨石、暴雨、轻风、朝阳……等成千上万的具体的物(这些物可能是有形的,可能是无形的),那我们把这些具体的物就叫做【对象】(至于为什么不叫其他名字,我想是因为引用对象名称的人一定是一个唯物主义的哲学家),所以我们的现实世界是由成千上万个对象组成的,因此我们是生活在充满对象的世界里并且我们天天都与这些对象发生或多或少的接触。从面向对象开发语言角度来看,以对象为基础看待问题就叫做【面向对象】。(到此还不明白面向对象?那我们看看官方怎么定义)
面向对象
理解面向对象可以从两个方面入手:面向对象思想(有点哲学的味道)、面向对象程序设计语言。
(1)面向对象思想:它是人们对自然界的一种认识,把世界中的所有事物都看作是【对象】,每个对象既是独立的,同时这些对象又是相互联系的。把这种思想应用到软件开发上,这样有助于开发人员可以把需要解决的问题看成是多个独立的、同时又相互联系的对象组成的系统,这样有助于开发人员更深入理解问题本身。
(2)面向对象程序设计语言:判断一门语言是否是面向对象的语言,主要看这个语言定义的类型是否支持对象的声明以及这个语言对对象的继承、封装和多态的支持程度。
面向对象基本概念
鉴于面向对象的官方说辞,面向对象涉及的基本概念有:抽象、封装、消息、继承、多态、对象、类。
(1)抽象
抽象是指从许多独立的事物中,抽取(获取)它们共性(大家都有的)的属性、舍弃个性(我有你没有的)的属性,从而形成一种概念的过程,至于这种概念的名称要视具体事物来定。
【举个例子】你女朋友让你买水果,你会买香蕉、苹果、西瓜等,而不是去买黄瓜、胡萝卜(蔬菜)。排除掉香蕉、苹果、西瓜的大小、颜色、形状(个性)后,我们得出它们的共性是水果,而排除掉黄瓜、胡萝卜的大小、颜色、形状(个性)后,我们得出它们的共性是蔬菜。那么得出水果、蔬菜概念的过程就是抽象的过程。
面向对象程序设计所采用的核心方法是数据抽象。数据抽象是将现实世界中存在的事物作为抽象单元,其抽象内容既包括事物的属性特征(一般用名词描述),也包括行为特征(一般用动词描述),而这些被用来做数据抽象的事物就是一个一个的对象。
【举个例子】我们各自所在的校园里,有许许多多学生(抽象单元),在抽象的过程中每个学生可以使用学号、姓名、班级、性别、年龄、选修的课程等信息进行描述(属性特征),同时每个学生还可以选课、上课等(行为特征)。通过从每个学生身上抽象出的这些信息和行为,可以描述出校园里的每一个学生。(相当于指名道姓了)
(2)封装
封装指将对象的属性和操作结合在一起,构成一个独立的对象,它的内部信息是隐藏的,不允许外界直接存取对象的属性,而只能通过指定的接口与对象联系。
【举个例子】冰箱(你家的冰箱就是一个独立的对象)与我们的生活息息相关了,它用外壳将冷气系统部件、各种管线等包裹起来(封装),我们只要插上电源(冰箱启动工作接口)并通过温度旋钮来设置温度(调节温度接口),冰箱就能为我们提供保鲜和冷藏功能了,而我们并不需要知道它的内部详细的工作机制。这就是封装。
在面向对象的程序设计中,封装是指将对象的属性和行为分别用数据结构和方法描述,并将它们绑定在一起形成一个可供访问的逻辑单元。用户对数据结构信息的访问只能通过逻辑单元中提供的方法实现。
【举个例子】我们各自所在的校园里,有许许多多的学生,他们的基本信息包括学号、姓名、班级、性别、家庭住址等,对这些属性的操作行为可以有:设置、获取、更新属性对应的值。现在,将描述这些属性的数据结构以及对属性实施各种操作行为的方法封装在一个对象中,并将其中的数据结构隐藏起来,不允许外界直接访问,而将其中的方法作为外界访问该对象属性的接口对外开放。这样一来其他对象只能通过这些方法对该对象实施各项操作。
(思考题:小明有喜欢的女生了,他对其他人说,谁给钱就告诉谁他喜欢的人是谁,不给钱甭想知道他的秘密。大家可以对照上面领会一下封装)
从封装的过程来看,封装是实现数据隐藏的有效手段,是一种很好的管理数据与操作数据行为的机制,它可以保证数据结构的安全性,提高应用系统的可维护性和可移植性。
(3)消息传递
消息是对象之间在交互中所传递的通信信息。简单地说,消息就是一个对象要求另一个对象实施其本身封装在内部操作的请求。在一条消息中,需要包含消息的接收者和要求接收者执行哪项操作的请求,但是并没有说明怎么样做,具体的操作执行过程及结果由接收者决定,这样可以保证系统的封装性。
消息传递是对象之间相互联系的唯一途径。发送者发送消息,接收者接收消息,至于消息的执行由接收者自行决定。消息传递的过程不断重复,从而使整个应用程序有序地运转,最终得到相应的结果并退出程序。可以说消息是面向对象程序运转的动力。
(4)继承
继承是类之间的一种关系,指一个类可以基于另一个已存在的类,使用另一个类的内容,前者称为“子类”或“派生类”,另一类称为“父类”或“基类”,这种基于某个类的方式称为继承。在此基础上,子类可以更改父类的内容(属性、方法),还可以为自己添加个性化的内容。
根据继承的特性,可以将继承分为:直接继承和间接继承、单继承和多继承。
【举个例子】直接继承和间接继承:现有A、B、C 3个类,其中B类继承A类,C类继承B类,那么B、C分别直接继承A类与B类,C类间接继承A类,这种间接继承体现了继承关系的可传递性。
【举个例子】单继承和多继承:如果一个类只有一个直接父类,则该继承关系被称为单继承;如果一个类有两个或两个以上的父类,则该继承关系称为多继承。Java语言只支持单继承。(这是规定)
父类与子类相比,父类涵盖了更加共性的内容,更具一般性、普遍性,而子类所添加的内容更加个性、更加具体。位于上层的父类概念更加抽象,位于下层的子类更加具体,所以说,从下往上,是逐步抽象的过程;从上往下,是逐步细化的过程。因此,解决问题的过程就是不断抽象和细化的过程。
继承机制是实现程序代码重用的基石,是提高软件系统的可扩展性和可维护性的主要途径。所谓继承是指一个类的定义可以基于另外一个已经存在的类,及子类基于父类,从而实现父类代码的重用。
简单点说,我们使用继承能省撸好多代码。(以后我们会体会到的)
(5)多态
当对象收到消息时要给予响应。不同的对象收到同一个消息可以产生不同的响应效果,这种现象就叫做多态。用户发送一个通用的消息,而实现的细节由接收对象自定决定,这样同一个消息可能导致最后的结果不一样。
【举个例子】猫、狗(不管什么猫、什么狗)都属于动物,动物都会叫,利用动物这个对象分别表示猫和狗,并让猫和狗都发出叫声,此时,猫会“喵~喵~喵”,狗会“汪汪汪”,那么同样都是动物也同样都会叫,但是发出的叫声却不一样,这就是多态机制导致发出同一个消息,因为接收消息的对象不同,将采用不同的处理方式,结果也就不一样了。
(6)对象
对象是现实世界中事物的抽象,用来描述整个世界中的每一个事物(不管是有形的还是无形的)。现实世界中的一个人、一名学生、一名教师、一名警察都是一个个的对象。在面向对象的程序设计方法中,对象既可以指一类事物(如人、水果),也可以指某个具体的事物(如小明、苹果)。
(7)类
类是一类事物的集合(物以类聚)。它是对现实世界中一类事物抽象的结果,其主要包含对一类事物属性及作用在这些属性上的行为的描述(方法)。如生物学分类中,动物就是对能自由运动、以碳水化合物和蛋白质为食的所有生物进行抽象得出的类。在实际的程序设计中,可以简单地认为类是一种类型。
总结
本文主要介绍了面向对象的概念及其涉及到的基本概念(抽象、封装、消息传递、继承、多态、对象、类),因此面向对象的主要特性是:抽象性封装性、消息传递、继承性、多态性。
概念性的东西,有的是就这样定义的,有的是规定,理解性地记住就行,千万表纠结。
什么?你还没搞懂什么是面向对象?没事,先记住这“七兄弟”:抽象、封装、消息传递、继承、多态、对象、类。待我们撸代码之时,就是我们明白面向对象之日!
你只需看着别人精彩,老天对你另有安排?你不行动,在想啥呢?(没有一点作料的鸡汤)
郑重声明:本文图片来源于网络,表情包的力量还是蛮大的嘛。(若有侵权,给你五毛不用找啦。下面请留言)