高手都说一切皆对象(面对对象--你怎么看呢)

Java
342
0
0
2022-08-25

学习面向对象编程,最主要的是要掌握使用面向对象的思想看待问题;

面向对象的思想,就来源于我们现实生活;学习面向对象编程,一定要多想想现实生活,从生活实际中找到答案;

1. 面向对象的引入

需求:计算一个班级的总分;

高手都说一切皆对象(面对对象--你怎么看呢)

需求升级后的问题:

高手都说一切皆对象(面对对象--你怎么看呢)

为了解决这个问题,我们学习了函数,通过将相同功能的代码抽取到函数中,在需要的时候再调用的方法,就可以解决上面的问题;

高手都说一切皆对象(面对对象--你怎么看呢)

总结:函数就是用来解决程序的复用性差的问题的;

问题升级:如果在多个程序中都出现相同的功能,怎么办?

高手都说一切皆对象(面对对象--你怎么看呢)

思考:原来在同一个类中,main函数中出现了相同的代码,为了解决程序复用性差的问题,我们是将相同的代码抽出来,形成函数,然后在需要的时候调用;

现在是函数重复了,能不能也将重复的函数抽取出来,然后在需要的地方调用?

在函数的定义中说了,函数时定义在类中的,所以也只能抽出来放到一个类中;

高手都说一切皆对象(面对对象--你怎么看呢)


高手都说一切皆对象(面对对象--你怎么看呢)

问题:将类中的函数抽出到其他类之后,在原来的类中无法直接调用了;到底在一个类中能否调用其他类中的函数呢?

在Java中,可以在一个类中调用其他类的方法;调用的办法是:

先使用new关键字创建一个目标类的对象,然后再原来的类中,通过创建的对象来调用;

格式:

创建一个类的对象:类名 对象名(也是一个变量名、对象的引用) = new 类名();

本例:

Tool tool = new Tool();

调用目标类中的方法:对象名.方法名(参数);

本例:tool.getSum(array);

高手都说一切皆对象(面对对象--你怎么看呢)

调用过程:

高手都说一切皆对象(面对对象--你怎么看呢)

总结:最后解决问题的方法,就是使用了面向对象的思路;使用面向对象,可以更大程度上解决程序的复用性差的问题;

2. 面向过程和面向对象

2.1. 面向过程

什么是过程:

就是做一件事情的先后经过;(也就是先做什么,后做什么)

生活中的过程:

泡面:1、烧开水;2、拆开包装,将面放进碗中;3、将调料撒到面上;4、倒开水进去,盖上;5等着泡好,开吃;

程序的过程:

程序中的过程,指的就是程序中代码执行的过程;

什么是面向过程:

面向过程,就是一种解决问题的思路;使用这种思路解决问题,我们关心的就是一个问题由那些步骤,然后按照顺序先后分别去做;

使用面向过程的思想写程序,就是先要将需求分析,确认由哪些功能组成,然后分别写函数实现相应的功能,然后按顺序依次调用;

在整个编程过程中,每一步都要开发者自己去做,是参与者;

前几天写的程序,就是使用面向过程的方法写的;

面向过程的好处和弊端:

好处:在需求简单的时候:思路清晰,程序结构简单,流程明确;

弊端:如果需求复杂了,因为面对的是非常多的函数功能,真个开发就会非常麻烦,维护也很困难;

面向过程最典型的就是C语言;

2.2. 面向对象

什么是对象:

指的是实在存在的一个个体;

生活中的对象:

张三李四;电脑;椅子;桌子;水杯;话筒;眼睛;电灯;空气;太阳;地球……

Java程序中的对象:

就是通过new关键字在堆内存中开辟的空间;

什么是面向对象:

也是一种解决问题的思路;这种思路关心的事情中的参与者;

使用面向对象写程序,首先也是进行需求分析,看需求由哪些功能组成,然后找有没有包含已经实现好的函数的类;

如果有,就创建这些类的对象,然后通过对象调用需要的功能;(面向对象的思想)

如果没有,就要自己创建一个类,然后在类中书写实现功能的函数(面向过程),然后载创建这个类的对象,通过对象调用;

在实际开发中,绝大多数的功能,都有已经实现好的,开发时直接调用就行了;在开发中,开发者更多的是在调用别人的函数;

面向过程和面向对象的关系:

面向对象是基于面向过程的;二者不是互相排斥的;

2.3. 面向过程和面向对象举例

吃饺子;

面向过程:

1、包饺子:先剁馅;在和面;包饺子;

2、煮饺子:烧水;下饺子;

3、吃;

4、收拾;

面向对象:

1、直接找一个饺子馆;

2、告诉老板你的需求(口味、数量、付钱,相当于在调用函数时给函数传参)

3、等着服务员端上(就相当于等待函数的返回结果)

4、吃

2.4. 面向过程和面向对象的区别

1、关注点不同:

i. 面向过程:关心的是事件中的每一步怎么做;

ii. 面向对象:关心的是事件中的功能有没有哪里已经实现好的;

2、效率不同:

i. 面向过程:因为自己要参与每一步的实现,所以效率比较慢;

ii. 面向对象:因为大多数都是调用别人已经实现好的功能,所以效率比较高;

3、开发质量:

i. 面向过程:因为是自己一步步实现的,大多数情况会有地方会出问题;

ii. 面向对象:因为大多数都是调用别人写好的功能,而这些功能一般都经过大量的验证,质量有保证;

4、使用范围不同:

i. 面向过程:适合解决需求简单的问题;

ii. 面向对象:更适合解决复杂的需求;

注意:面向对象是基于过程的;

3. 对象在需求中的使用和练习

在使用面向对象的思想解决问题的时候,第一步也是最重要的一步,就是 找对象;

1.1. 需求一:模拟猫抓老鼠;

场景:

1、猫看见老鼠;

2、猫追老鼠;

3、猫抓老鼠;

1、找对象:

名词提炼法:就是在需求描述的文字中找名词;

名词: 猫 老鼠;

对象: 猫 老鼠;

2、伪代码描述对象:

伪代码:就是使用自己理解的符号,非java代码;

伪代码描述:

高手都说一切皆对象(面对对象--你怎么看呢)

3、伪代码模拟场景:

猫 汤姆 = new 猫();

老鼠 杰瑞 = new 老鼠();

汤姆.看(杰瑞);

汤姆.追(杰瑞);

汤姆.抓(杰瑞);

练习一:人吃饺子;

找对象:

名词: 人 饺子;

找对象:人 饺子

伪代码描述对象:

人{

吃(饺子){}

饺子{}

场景模拟:

人 小明 = new 人();

饺子 东北水饺 = new 饺子();

小明.吃(东北水饺);

4. 对象在代码中的体现

高手都说一切皆对象(面对对象--你怎么看呢)

5. 对象的内存图解

高手都说一切皆对象(面对对象--你怎么看呢)

高手都说一切皆对象(面对对象--你怎么看呢)

总结:对象就是在堆内存空间中开辟的一块空间;

通过对象调用函数和对象的成员变量,那个对象调用,就找的是那块内存空间中的值;

6. 类和对象的区别

高手都说一切皆对象(面对对象--你怎么看呢)

先有类,才有对象的;对象是根据类创建的;

7. 局部变量和成员变量

7.1. 概念

成员变量: 就是直接定义在类中的变量;

局部变量:就是定义在局部范围的变量,比如函数中;

高手都说一切皆对象(面对对象--你怎么看呢)

7.2. 同名的局部变量和成员变量的使用

高手都说一切皆对象(面对对象--你怎么看呢)

在函数中要使用一个变量,会首先在本函数中找,如果没有定义,再回去类中找成员变量;如果定义了,就优先使用函数中定义的局部变量;

7.3. 区别

1、从定义的位置上:

a) 局部变量:定义在局部范围,如函数中;

b) 成员变量:直接定义在类中;

2、从内存上看:

a) 局部变量:栈中;

b) 成员变量:堆内存中

3、从生命周期(指的是从分配空间到回收空间)上看:

a) 局部变量:随着函数进栈执行,开始分配空间;函数出栈,空间被回收;

b) 成员变量:随着创建对象的时候在堆中分配空间;随着对象的空间被回收的时候,变量空间也被回收;

4、从使用范围上:

a) 局部变量:只能在定义它的范围中使用;

b) 成员变量:可以在定义它的整个类中使用;

5、从初始值上看:

a) 局部变量:没有默认值,要使用,必须先要初始化赋值;

成员变量:有默认值,不需要先赋值,就可以直接使用;也可以在使用前先赋值;

8. 匿名对象

8.1. 什么是匿名对象

匿名:没有名字;

匿名对象:就是没有名字的对象;

什么是对象的名字?

我们操作对象,都是通过保存了对象的地址的变量(又叫对象的引用)来进行的;

这个对象的引用就叫做对象的名字;

对象可以有多个名字,所有保存该对象的引用的变量都是对象的名字;

对象也可以没有名字;

如果一个对象创建出来后,不将地址赋值给任何变量,就是一个匿名对象;

类:Car;
Car car = new Car();
new Car();//匿名对象;

8.2. 匿名对象的局限

高手都说一切皆对象(面对对象--你怎么看呢)

8.3. 匿名对象的应用

高手都说一切皆对象(面对对象--你怎么看呢)


高手都说一切皆对象(面对对象--你怎么看呢)

1. 引用传递和按值传递

高手都说一切皆对象(面对对象--你怎么看呢)

按值传递

基本数据类型的变量进行传参,实际传递的是存放在变量中的常量值,这种传参方式叫做按值传递;

这种传参方式,修改一个变量的值,对其他变量都没有影响;

引用传递:

引用类型的变量进行传参,实际传递的是存放在变量中堆内存的地址,这种方式叫做引用传递;

这种方式传参,通过变量操作一个数据,对其他拥有这个引用的变量,都有影响;