学习面向对象编程,最主要的是要掌握使用面向对象的思想看待问题;
面向对象的思想,就来源于我们现实生活;学习面向对象编程,一定要多想想现实生活,从生活实际中找到答案;
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. 引用传递和按值传递
按值传递:
基本数据类型的变量进行传参,实际传递的是存放在变量中的常量值,这种传参方式叫做按值传递;
这种传参方式,修改一个变量的值,对其他变量都没有影响;
引用传递:
引用类型的变量进行传参,实际传递的是存放在变量中堆内存的地址,这种方式叫做引用传递;
这种方式传参,通过变量操作一个数据,对其他拥有这个引用的变量,都有影响;