![91d8ec67d6aa862cbc6b6f4b8d9dd3c9.png](https://i-blog.csdnimg.cn/blog_migrate/2e0d444891927320b6204545bd83acbe.jpeg)
面向对象本身不难理解,但是想要完全掌握,需要长时间的锤炼。
编程语言的发展
![81c508cf4787d28c68ba70e2dcaccc3a.png](https://i-blog.csdnimg.cn/blog_migrate/4ee6aa566064ef2dea272f12d7741fc4.jpeg)
整体看来,计算机语言的发展是朝着人类更容易理解的方向前进,高级语言是面向过程的语言,而Java属于面向对象语言。面向对象语言是目前人类最容易理解的语言,因为我们的生活中,基本上看到的任何事物都可以看作是一个个对象。
一个水杯,一个电脑,一个人... ...都可以看作是一个对象。
面向过程的设计思想和面向对象的设计思想
想要理解什么是面向对象设计思想,我们先来对比一下面向过程的设计思想。
例如有这么一个事件:我要开车去新疆。
如果我们采用面向过程的思想处理这件事:
流程1:我开车-->我挂档-->我踩油门-->我过河北-->我过陕西......-->我到新疆
所有一切以“我”为中心。
如果我们采用面向过程的思想处理这件事:
流程2:我命令车去新疆。
车怎么去新疆不关我的事。
在面向对象的设计思想中,信息封装在车这个类的内部,"我"不用去了解车整个开动过程,也不需要了解车是什么构造,自行车,汽车,公交车都可以,只要"我"命令车去新疆,车启动就可以了。"我"不必了解车的细节和开动过程,了解车的是车本身,哪怕将来车改动了本身结构,"我"也不必了解。
由此可见,我们需要改变的是思维方式:遇见一个问题,首先抽离出问题中有哪些对象和对象之间有什么关系,而不是我这一步做什么,下一步做什么......
对象和类
什么叫对象,什么叫类呢?
假设现在有一个瓶子,我们如何定义一个瓶子呢?容器?能倒水?椭圆型?有盖子? ... ...
这个下定义的过程就是我们对"瓶子“抽象的过程。我们发现当我们在定义或者说描述什么是瓶子的时候,瓶子的特征描述方式分两类:名词形容和动词形容。
其中,名词指的是:颜色,形状... ... 动词指的是:能倒水... ...
反应到我们的程序中,那就是属性(Attribute)和方法(method).具体到某一个瓶子,我们称之为对象,而对某一类具有共同特征的事物的抽象描述我们称之为对象(瓶子)。
瓶子是类,桌子是类,学生... ...是类。
马老师的水杯,那个桌子... ...是对象。
总而言之,对象是计算机语言对问题域中事务的描述,对象通过属性(Attribute)和方法(method)分别对应事物所具有的静态属性和动态属性。
类是用于描述同一类型的对象的一个抽象的概念,类中定义了这一类对象所共同具有的静态和动态属性。
类是对象的模板,对象是类的一个具体实例。
![6a43986c7978ad6ae7a33e7fbb3768eb.png](https://i-blog.csdnimg.cn/blog_migrate/9afae803879f3c01f90f6491bf6bbb70.jpeg)
上图中描述的是一个公司职员如何在计算机语言中被抽象并实例化描述的过程。
"-" : 静态属性,职员的年龄属于他本身的一个静态特征。
"+" :动态属性,修改名字这类事情需要他自己去做,所以是职员自己的方法。
就这样,我们抽象出了一个职员类,根据这个类,我们衍生(实例化)出想要的对象。
注意:属性又叫成员变量。
类(对象)之间的关系 之 关联关系
类和类之间是有关系的,学生(类)和老师(类)之间是有关系的,老师教学生,学生向老师学习。关系和关系之间也是不同,学生(类)和老师(类)之间和学生(类)与朋友(类)之间的关系是不同的。
关系最弱的一种关系叫关联关系。关联关系映射到代码上就是:一个类的方法里是另一个类的具体某一对象。比如:教授(类)教研究生(类)。就是教授的教(teach)方法中有一个研究生对象。之前我们的方法中参数类型有int,short,long.......但是我们学习完面向对象后,参数类型就可以五花八门,例如:研究生类型的参数类型。
![9c3e692a39b31564575340ac9cd7c2ec.png](https://i-blog.csdnimg.cn/blog_migrate/6a54241dd0da6439d98389575dac8e4b.jpeg)
类(对象)之间的关系 之 继承关系
继承关系封装了一种逻辑:xx是一种xxx.只要符合这样一种逻辑,我们都可以使用继承方式来封装它。如下图所示:
![d5e66829f69f87fa9109c240002a465e.png](https://i-blog.csdnimg.cn/blog_migrate/3e9806c3120f1002684a6fc613e86c3e.jpeg)
游泳运动员继承了运动员,符合 “游泳运动员是一种运动员” 的逻辑。
足球运动员继承了球类运动员,符合 “足球运动员是一种球类运动员” 的逻辑。
球类运动员继承了运动员,符合 “球类运动员是一种运动员” 的逻辑。
... ...
学生类继承人类,老师类可以继承人类,但是学生类不能继承老师类,因为“学生是一种老师”这个逻辑不成立。
思考:一个类可以继承多个类吗?
可以。比如金丝猴可以继承"动物"类,也可以继承"受国家保护的"类,因为它既是一种动物,又是受国家保护的一种东西。
所以,C++存在多重继承。
类(对象)之间的关系 之 聚合关系
聚合就是整体和部分之间的关系。如下图所示:队长(类)和队员(类)聚合在一起形成了球队(类)。聚合逻辑为:xx是xxx的一部分。
![8880b03ff8597fba61750ed708d3d62f.png](https://i-blog.csdnimg.cn/blog_migrate/92fe03b34c61a539992af4fecda0a282.jpeg)
聚合中聚集的类是可以相互独立的,我是A球队的队员也可以是B球队的队员。而另一种聚合是密不可分的,我们称之为:组合。如上图所示,一个人的头,脑...等身体器官只属于一个人,不可以既属于A又属于B.
类(对象)之间的关系 之 实现关系
实现关系在我们学习完毕“接口”的概念后更容易深入理解,本章我们只做初步了解。
如果我想开车去新疆,不管我用哪一类车,它们都该有一个方法叫“run"或者”开跑""启动"等,那么,具体这个run方法如何实现呢?大卡车(类),自行车(类),小轿车(类)都是从车(类)继承。这时,我们发现每一种车都有对不同run的实现方法,因为每一种车run的方式不同。对于车(类)来说,我并不知道具体怎么run,因为每一类车不同。这时我们就叫:不同的车(类)对车(类)的run方法有不同的实现,这就是实现关系。
和实现关系息息相关的一个知识点“多态”我们随后章节再说。
课堂练习
【指导思想】
1 分析出问题域中涉及的类和对象。
2 类和对象有哪些属性。
3 类和对象有那些关系。
1)
如下图所示,为旅行社的一个简易订票系统:旅行社有订票系统,客人使用这个系统的时候,首先,系统会在各个航空公司的航班目录中找到客人想要的票,然后预定下来,随后系统将使用记账文件记账。
![135318219ff2d81d054f74bac4fe75a0.png](https://i-blog.csdnimg.cn/blog_migrate/b875927046ce059b2c0fc3237df8f2aa.jpeg)
根据指导思想,在这个问题中有哪些类呢?
我们找名词:旅行社,旅客,机票,航班目录,记账文件等
针对机票,它有哪些属性呢?时间,价格,班次... ...
它有哪些方法呢?作废。
2)
回到我们去新疆的问题,"我要去新疆"这句话中的类和方法是什么呢?
类:人,车。
方法:开动。
当然还有其他方法,吃喝拉撒睡,但是只要跟我们的业务逻辑无关的,我们都可以省略。
Java与面向对象
那么,我们如何把上述思想转化为代码呢?
![16e92bd13f6ab8179015fe90a617d88d.png](https://i-blog.csdnimg.cn/blog_migrate/d6723844a4e11634fe49a9a21a73b053.jpeg)
对象和类是不可分割的,必须首先定义类,我们才能根据类创建出所属对象。脑子中没有瓶子的概念,就无法制作出一个特定的瓶子。
静态属性以后我们简称为:属性或者成员变量。动态属性我们称之为方法或者函数。
在Java中定义一个狗类如下:
Dog.java
![61c213abf003c763071d290d926ff5eb.png](https://i-blog.csdnimg.cn/blog_migrate/21136d0db34f84ce40c99d38c7a37579.jpeg)
阅读:
![74f0ad4d6ff88d69b06d2203c8db3c64.png](https://i-blog.csdnimg.cn/blog_migrate/e7094b20b30aa56c76e37759a6c75b35.jpeg)
Java类的定义
我们使用class关键字来定义一个类,class后面跟类名。例如:
Person.java
![f9e6e6f6b4ba196ed9f59e0c31d7d1f9.png](https://i-blog.csdnimg.cn/blog_migrate/730a1e44f79ad0f3671bac85375f6b3e.jpeg)
注意:private,public 均为修饰符,本章节暂不讨论。
成员变量
在java中,成员变量可以是任意类型,定义成员变量时,可以对其进行初始化(如Person.java中的age变量),也可以不进行手动初始化,则java使用默认值对其初始化,不同的数据类型对应的默认取值如下图所示:
![f321d02474d47be0baeb4e36eded0d38.png](https://i-blog.csdnimg.cn/blog_migrate/034847fa616df7f79cc5626606379b91.jpeg)
注意:所有的引用数据类型默认值为null; 局部变量java不会对其默认初始化。
Java面向对象基本概念 - 引用
在java中,除了基本数据类型之外的所有其他类型,我们都称之为:引用数据类型。例如,上述中的Person类,Dog类等。
【内存分析】
在"int i = 0;"这行代码执行过程中发生了什么呢?
这个i在内存中开辟了一块空间,引用数据类型则开辟两块空间。
Test01.java
![ea2977339ccd3dc1a9ad44f7b819f68d.png](https://i-blog.csdnimg.cn/blog_migrate/bf5974c7d6dc9ca26dc47525c9826a6d.jpeg)
![031c408bbcc645b2053408d353595f7a.png](https://i-blog.csdnimg.cn/blog_migrate/fe2d3892e4c9dfd82948d93db4e85e39.jpeg)
注意:方法只有在被调用的过程中才会占用内存。
对象的创建和使用
![13ac398b97f951e76c30b2ac5db011eb.png](https://i-blog.csdnimg.cn/blog_migrate/1ab60064984efa87a5f83a7a729647ca.jpeg)
不同的狗在内存开辟不同空间,但是每个存储空间都有相同属性,属性值不同。
方法复习**(阅读)**
![534b25d348defb55ff742f75b52fbf38.png](https://i-blog.csdnimg.cn/blog_migrate/cae9fd2b0237c1923f729f82c8c7e59b.jpeg)
类和对象的关系
【内存分析】
假设有类C,我们定义了i ,j 两个属性,随后我们在main方法中定义了c1,c2两个对象,c1指向一块内存,c2指向一块内存,他俩是两个不同的对象。
因为局部变量分布在stack栈内存,那就说明c1,c2都在栈空间。而c1和c2指向的对象所在的内存为heap seg 堆内存空间,我们的成员变量就存在于每一个对象所在的堆内存空间之中。
c1.i, c1.j, c2.i, c2.j是我们分别拿到c1,c2对象的成员变量的方式。
![1b83a349e5da5ad312b1494df4065ba4.png](https://i-blog.csdnimg.cn/blog_migrate/c288b9c5121283a967c7c30420864191.jpeg)
注意:其他面向对象的程序设计语言内存分配大同小异。