面向对象,面向对象的优点
什么是面向对象呢,百度百科的词条解释是这样的
面向对象(Object Oriented)是软件开发方法,一种编程范式。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。
面向对象是相对于面向过程来讲的,面向对象方法,把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式。 [1]
那可能听起来不是很明白,我们可以用更通俗的语言去理解
当我们要去用微波炉来加热食物的时候,用面向过程的思想,或者说用我们自己的思路来讲,是这样的
1.走到微波炉前
2.打开微波炉门
3.放置食物
4.关闭微波炉门
5.设置加热参数
6.开始加热并等待加热结束
7.打开微波炉门
8.取出食物
那当然,我们可能实际上遇到的实例可能会更加复杂,我们仅作例子探讨
那面向对象可能就不关注具体的每一步了,把每一个独立的个体,当作一个对象来思考,然后将这些对象的各自的属性,方法进行使用和调用
面向对象的思路可能就会是下面这样的
人
- 移动
- 开关门
- 放置/取出食物
微波炉
- 开关门
- 加热(可以设置加热参数)
随后只需要将对应的,所需要的,进行于组合就可以了,具体实现的方法过程可能还会是如面向过程一样,但是可复用性强,易于维护
比如说我们现在不只需要加热食物,我们还需要其会从冰箱里拿取饮料,那面向过程就会有两种情况,一种是拿饮料在加热食物之前,执行完拿饮料才加热食物,一种是在加热食物之后,执行完加热食物才拿饮料
而面向对象只需要变成如下就行
人
移动
开关门
放置/取出食物
放置/取出饮料(这一点甚至可以与上一点复用)
微波炉
开关门
加热(可以设置加热参数)
冰箱
开关门
制冷
因此我们可以自由设定是在之前还是之后,取决于调用的时机不同,不需要重复删减,更新代码,同时当我们有其他的需要之后,只需要扩展方法即可
具体的示例代码如下
public class Human{
String name = "anonymity";
int age = 0;
public Human(String name,int age){
this.name = name;
this.age = age;
}
public Human(){}
}
首先创建了一个人类类,或者说叫人类模板,他会带有名字和年龄,如果创建的时候指定了名字和年龄,那么他就有名字和年龄,否则就是无名氏并且年龄为零
那么在人类之下,又会有类似于士兵,这是会保护其他人的人类,同时也会对其他人带有攻击性的人类,还有的就是农民,这是会带来食物的人类。
那么这两个人类肯定不会是同样的人类,但他们都会带有人类模板的共同属性,也就是名字和年龄,代码如下
我们代码编写完了可以创建一个测试类进行测试一下
运行结果如下
那可以看得出来面向对象可以重复的调用,并且易于修改,假如说士兵需要更换装备,农民需要更换农具,这些都需要修改,如果用我们的这个思想,就会非常的简单。
那这里,我们也就发现了面向对象的一些特性
1.继承
2.多态
3.封装
可能2 和 3都不是很明显,但是1肯定是能看出来的,不管是士兵还是农民,都继承自人类类,在各自的类中,没有定义名字和年龄,但是却自带有名字和年龄(还有构造方法)
多态主要体现在子类可以扩展父类的方法,增加方法,变得更加的多样
比如说普通的人类的移动可能会叫,走路,跑步,但是在士兵身上,就叫做行军
或者是动物类会叫,但是各种动物的叫都不一样,比如说狗的吠,鸟的啼
封装就是,作为用户(也包括开发人员),不在意内部的实现细节,只关注能否实现,并且将内部的细节隐藏起来,保护起来不被破坏
比如说微波炉,作为用户,我们并不关心发热管是怎么发热的,是用电磁发热还是超声波发热,甚至是核加热我们也不关心,我们只关心加热的效率以及是否有害等
在刚刚的代码例子中,我们并没有很好的实现封装特性,或者说是保护特性,在Java中可以用private关键字可以保护起来
这里举出一个例子
这样子也可以达到一样的效果,但是会很好的保护到内部的数据,可能这个例子并不能很好的体现出来,在我们后面的学习中,会遇到很好的用到的地方



